/**********************************************************************/
/*                                                                    */
/*  WaveMaker - a program to allow a user to construct waveforms      */
/*              by superposition of harmonic sine waves.              */
/*                                                                    */
/*                                                                    */
/*  This program is intended for beginning music and physics students */
/*  to help them get a better intuitive feel for constructing a       */
/*  complex wave form from a sum of harmonics.                        */
/*                                                                    */
/*  For program operation see WaveMaker.doc.                          */
/*                                                                    */
/*  This program was written in SAS C, version 5.10.  It is           */
/*  compiled with the enclosed lmkfile.                               */
/*                                                                    */
/*  WaveMaker is freely distributable as long as it is not sold for   */
/*  profit.  It is permitted (encouraged) to include it on software   */
/*  collections sold for a nominal sum, such as club disks and        */
/*  Fish disks.  Copyright is retained by the author.                 */
/*                                                                    */
/*  Thanks are due to those people who posted example programs in     */
/*  the BIX listings area.  One good example is worth several chapters*/
/*  of explanation.  Of particular use were gad.c and menu.c. both by */
/*  John Draper, and scales.c by Steven A. Bennett.                   */
/*                                                                    */
/*  Comments, bugs, complaints, and praise may be sent to me at       */
/*                  Thomas Meyer                                      */
/*                  12 Physics, Iowa State University                 */
/*                  Ames, IA 50010                                    */
/*                  BIX: TMEYER                                       */
/*                  BITNET:MEYER@ALISUVAX                             */
/*                  Internet: meyer@iastate.edu                       */
/*                                                                    */
/**********************************************************************/
/*                                                                    */
/* Update history:                                                    */
/*    4/10/91    Version 1.2                                          */
/*                 Wave calculation speeded up                        */
/*                 Bad pointers fixed (guru causers)                  */
/*                 Display of partial sums added                      */
/*                 Bug fixed in display when waveform rescales        */
/*    1/24/90    Version 1.1                                          */
/*                 Easy game added                                    */
/*                 Fixed crashes from rawkey>64                       */
/*                 Closed down in correct order                       */
/*                 Game doesn't interfere with amps[]                 */
/*                 Random seed from timer                             */
/*    1/21/90    Version 1.0 released on AAAUG club disk              */
/**********************************************************************/

#include <math.h>
#include <stdio.h>
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/ports.h>
#include <exec/devices.h>
#include <exec/memory.h>
#include <hardware/custom.h>
#include <hardware/dmabits.h>
#include <proto/dos.h>
#include <devices/audio.h>
#include <devices/inputevent.h>
#include <proto/intuition.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <graphics/clip.h>
#include <graphics/view.h>
#include <graphics/rastport.h>
#include <proto/layers.h>

extern struct MsgPort *CreatePort();
extern VOID ModifyProp();
extern VOID PrintIText();

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Window *Window;
struct Screen *Screen;
struct ViewPort *ViewPort;
struct RastPort *rport;
struct IntuiMessage *mesg;
struct IOAudio *ioa,*audchan[4],*finish[4];

/****************************************/
/*  Build the Intuition Gadgets         */
/****************************************/

/*      Define Logicals for GadgetIDs   */

#define HARMON0 0
#define HARMON1 1
#define HARMON2 2
#define HARMON3 3
#define HARMON4 4
#define HARMON5 5
#define HARMON6 6
#define HARMON7 7
#define INTEG   0
#define UPARROW 8
#define DNARROW 16
#define PROPOR  24
#define PLUSMINUS 32
#define SELECT  64
#define YES     1
#define NO      0
#define NBR_IOA_STRUCTS 6

/* define logicals for ErrExit */

#define SUCCESS         0
#define INTUITION_FAIL  1
#define GRAPHICS_FAIL   2
#define PORTPN_FAIL     3
#define PORTP0_FAIL     4
#define AUDIOALLOC_FAIL 5
#define AUDIO_FAIL      6
#define USERSOUND_FAIL  7
#define REFSOUND_FAIL   8
#define SCREEN_FAIL     9
#define WINDOW_FAIL    10

/*  Miscellaneous logicals */

#define INTUITION_REV 0
#define GRAPHICS_REV 0

#define TWOPI 6.283185

/*************************************/
/*  Global variables and structures  */
/*************************************/

SHORT sinewave[8][513];
LONG amps[8],refamps[8];
LONG maxuser=1,maxref=1;
LONG maxamp=16066;
BYTE waveform[514],refform[514],selform[514];
BYTE *usersound,*refsound;
BYTE sunit=0x0F;
SHORT audiochan[128] ={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	               -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	               -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	               -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	               -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	               -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	               -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	               -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
SHORT waiting[5]={NO, NO, NO, NO, NO};
SHORT gameon=NO;
UBYTE selflag,bitval[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
                        0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
VOID ErrExit();

/*  Structures for drawing waveforms    */

USHORT userwave[513][2],refwave[513][2],selwave[513][2];

struct Border UWave_brd1 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	4,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&userwave[0][0],          /* Count, *XY                     */
	NULL                          /* *NextBorder                    */
};
struct Border UWave_brd2 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	4,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&userwave[126][0],        /* Count, *XY                     */
	&UWave_brd1                   /* *NextBorder                    */
};
struct Border UWave_brd3 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	4,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&userwave[252][0],        /* Count, *XY                     */
	&UWave_brd2                   /* *NextBorder                    */
};
struct Border UWave_brd4 =
{ 
	64,13,                        /* LeftEdge, TopEdge              */
	4,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&userwave[378][0],        /* Count, *XY                     */
	&UWave_brd3                   /* *NextBorder                    */
};
struct Border UWave_brd5 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	4,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	9,&userwave[504][0],          /* Count, *XY                     */
	&UWave_brd4                   /* *NextBorder                    */
};
struct Border RWave_brd1 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	6,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&refwave[0][0],           /* Count, *XY                     */
	NULL                          /* *NextBorder                    */
};
struct Border RWave_brd2 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	6,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&refwave[126][0],         /* Count, *XY                     */
	&RWave_brd1                   /* *NextBorder                    */
};
struct Border RWave_brd3 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	6,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&refwave[252][0],         /* Count, *XY                     */
	&RWave_brd2                   /* *NextBorder                    */
};
struct Border RWave_brd4 =
{ 
	64,13,                        /* LeftEdge, TopEdge              */
	6,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&refwave[378][0],         /* Count, *XY                     */
	&RWave_brd3                   /* *NextBorder                    */
};
struct Border RWave_brd5 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	6,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	9,&refwave[504][0],           /* Count, *XY                     */
	&RWave_brd4                   /* *NextBorder                    */
};

struct Border SWave_brd1 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	5,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&selwave[0][0],           /* Count, *XY                     */
	NULL                          /* *NextBorder                    */
};
struct Border SWave_brd2 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	5,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&selwave[126][0],         /* Count, *XY                     */
	&SWave_brd1                   /* *NextBorder                    */
};
struct Border SWave_brd3 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	5,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&selwave[252][0],         /* Count, *XY                     */
	&SWave_brd2                   /* *NextBorder                    */
};
struct Border SWave_brd4 =
{ 
	64,13,                        /* LeftEdge, TopEdge              */
	5,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	127,&selwave[378][0],         /* Count, *XY                     */
	&SWave_brd3                   /* *NextBorder                    */
};
struct Border SWave_brd5 =
{
	64,13,                        /* LeftEdge, TopEdge              */
	5,0,JAM1,                     /* FrontPen, BackPen, DrawMode    */
	9,&selwave[504][0],           /* Count, *XY                     */
	&SWave_brd4                   /* *NextBorder                    */
};

/*      Declare the character buffer for IntuitText structures 
        (to be filled later).                                         */
	
char textbuf[6]="    0";

struct IntuiText textamp =
{
	1,0,JAM2,           /* FrontPen, BackPen, DrawMode            */
	0,0,                /* LeftEdge, TopEdge (use offsets to set) */
	NULL,               /* *ITextFont   (use default)             */
	(char *)&textbuf,   /* *IText (fill later)                    */
	NULL                /* *NextText                              */
};

/*   Border structures for the amplitude display box                  */

USHORT BoxPairsb[9][2]=
{
	2,11, 53,11, 53,2, 54,2, 54,11,
	55,11, 55,2, 56,2, 56,11       /* Brown shadow around int */
};

struct Border brdi1b =
{
	-2,-2,2,0,           /* LeftEdge, TopEdge, FrontPen, BackPen   */
	JAM1, 9,             /* DrawMode, Count                        */
	(USHORT *)&BoxPairsb,/* *XY                                    */
	NULL                 /* *NextBorder                            */
};

USHORT BoxPairs[5][2]=
{
	0, 0,  52,0,  52,10,   0,10,  0,0  /* Coords of box  */
};

struct Border brdi1 =
{
	-2,-2,1,0,           /* LeftEdge, TopEdge, FrontPen, BackPen   */
	JAM1, 5,             /* DrawMode, Count                        */
	(USHORT *)&BoxPairs, /* *XY                                    */
	&brdi1b              /* *NextBorder                            */
};

/*************************************/
/*     First amplitude gadgets       */
/*************************************/

/*  Proportional gadget  */

struct PropInfo prop_info1 =
{
	AUTOKNOB|FREEVERT,  /* Flags                                  */
	0xFFFF,0xFFFF,      /* HorizPot, VertPot                      */
	0x0800,0x0800,      /* HorizBody, VertBody                    */
	16,64,              /* CWidth,CHeight                         */
	0x0800,0x0800,      /* HPotRes, VPotRes                       */
	0,0                 /* LeftBorder, TopBorder                  */
};

struct IntuiText protext1 =
{
	1, 2, JAM2,         /* FrontPen, BackPen, DrawMode            */
	-20, 3,             /* LeftEdge, TopEdge                      */
	NULL,"1:",          /* *ITextFont, *Itext                     */
	NULL                /* *NextText                              */
};

struct Image empty1,empty2,empty3,empty4,empty5,empty6,empty7,empty8;

struct Gadget propor1 =
{
	NULL,65,113,               /* *NextGadget, LeftEdge, TopEdge     */
	14,69,GADGHCOMP|AUTOKNOB,  /* Width, Height, Flags               */
	RELVERIFY|GADGIMMEDIATE,   /* Activation                         */
	PROPGADGET,(APTR)&empty1,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	&protext1,0,               /* *GadgetText, MutualExclude         */
	(APTR)&prop_info1,         /* SpecialInfo                        */
	HARMON0|PROPOR,            /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   Up arrow gadget     */

USHORT updn_shadata[] = {2,7, 17,7, 17,1, 18,1, 18,7, 19,7, 19,1};
struct Border updn_shadow =
{
	-2,-1,2,0,               /* LeftEdge, TopEdge, FrontPen, BackPen */
	JAM1,7,                  /* DrawMode, Count                      */
	(USHORT *)&updn_shadata, /* *XY                                  */
	NULL                     /* *NextBorder                          */
};

USHORT updn_data[] = {0,0, 0,6, 16,6, 16,0, 0,0};
struct Border updn_border =
{
	-2,-1,1,0,              /* LeftEdge, TopEdge, FrontPen, BackPen */
	JAM1,5,                 /* DrawMode, Count                      */
	(USHORT *)&updn_data,   /* *XY                                  */
	&updn_shadow            /* *NextBorder                          */
};

USHORT uparr_data[] = {8,2, 3,4, 13,4, 8,2};
struct Border up_arr =
{
	-2,-1,1,0,              /* LeftEdge, TopEdge, FrontPen, BackPen */
	JAM1,4,                 /* DrawMode, Count                      */
	(USHORT *)&uparr_data,  /* *XY                                  */
	&updn_border            /* *NextBorder                          */
};

struct Gadget up1 =
{
	&propor1,44,143,           /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&up_arr, /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON0|UPARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   down arrow gadget  */

USHORT dnarr_data[] = {3,2, 13,2, 8,4, 3,2};
struct Border dn_arr =
{
	-2,-1,1,0,              /* LeftEdge, TopEdge, FrontPen, BackPen */
	JAM1,4,                 /* DrawMode, Count                      */
	(USHORT *)&dnarr_data,  /* *XY                                  */
	&updn_border            /* *NextBorder                          */
};

struct Gadget dn1 =
{
	&up1,44,152,               /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&dn_arr,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON0|DNARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*  Change sign gadget  */

                /* tie shadow for proportional gadget here since
		I can't get border structures working for prop gadgets */
USHORT pshad_data[] = {24,23, 38,23, 38,-45, 39,-45, 39,23, 40,23, 40,-45};

struct Border propshad =
{
	-2,-2,2,0,             /* LeftEdge, TopEdge, FrontPen, BackPen   */
	JAM1, 7,               /* DrawMode, Count                        */
	(USHORT *)&pshad_data, /* *XY                                    */
	NULL                   /* *NextBorder                            */
};

USHORT plus1[] = {5,3, 9,3};
USHORT plus2[] = {7,2, 7,4};
USHORT minus[] = {5,6, 9,6};
USHORT plmi_data[] = {0,0, 0,8, 15,8, 15,0, 0,0};
USHORT plmi_datas[]= {2,9, 16,9, 16,1, 17,1, 17,9, 18,9, 18,1};

struct Border plmi1 =
{
	-2,-1,1,0,            /* LeftEdge, TopEdge, Frontpen, BackPen */
	JAM1,2,               /* DrawMode, Count                      */
	(USHORT *)&plus1,     /* *XY                                  */
	&propshad             /* *NextBorder                     */
};

struct Border plmi2 =
{
	-2,-1,1,0,              /* LeftEdge, TopEdge, Frontpen, BackPen */
	JAM1,2,                 /* DrawMode, Count                      */
	(USHORT *)&plus2,&plmi1 /* *XY, *NextBorder                     */
};

struct Border plmi3 =
{
	-2,-1,1,0,              /* LeftEdge, TopEdge, Frontpen, BackPen */
	JAM1,2,                 /* DrawMode, Count                      */
	(USHORT *)&minus,&plmi2 /* *XY, *NextBorder                     */
};

struct Border plmi4 =
{
	-2,-1,1,0,                  /* LeftEdge, TopEdge, Frontpen, BackPen*/
	JAM1,5,                     /* DrawMode, Count                     */
	(USHORT *)&plmi_data,&plmi3 /* *XY, *NextBorder                    */
};

struct Border plmi5 =
{
	-2,-1,2,0,                   /* LeftEdge,TopEdge, Frontpen,BackPen */
	JAM1,7,                      /* DrawMode, Count                    */
	(USHORT *)&plmi_datas,&plmi4 /* *XY, *NextBorder                   */
};

struct Gadget plusminus1 =
{
	&dn1,44,161,               /* *NextGadget, LeftEdge, TopEdge     */
	15,8,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&plmi5,   /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON0|PLUSMINUS,         /* GadgetID                           */
	NULL                       /* UserData                           */
};


struct Border sel_off_shad =
{
	-2,-1,2,0,                   /* LeftEdge,TopEdge, Frontpen,BackPen */
	JAM1,7,                      /* DrawMode, Count                    */
	(USHORT *)&updn_shadata,     /* *XY                                */
        NULL                         /* *NextBorder                        */
};

struct Border sel_on_shad =
{
	-2,-1,2,0,                   /* LeftEdge,TopEdge, Frontpen,BackPen */
	JAM1,7,                      /* DrawMode, Count                    */
	(USHORT *)&updn_shadata,     /* *XY                                */
        NULL                         /* *NextBorder                        */
};

USHORT selon_data[] = {0,0, 0,6, 16,6, 16,0, 1,0, 1,1, 15,1, 15,2,
                       1,2, 1,3, 15,3, 15,4, 1,4, 1,5, 15,5};

USHORT seloff_data[] = {1,1, 15,1, 15,2,
                        1,2, 1,3, 15,3, 15,4, 1,4, 1,5, 15,5};

struct Border sel_off2 =
{
	-2,-1,0,0,                   /* LeftEdge,TopEdge, Frontpen,BackPen */
	JAM1,10,                     /* DrawMode, Count                    */
	(USHORT *)&seloff_data,      /* *XY                                */
        &sel_off_shad                /* *NextBorder                        */
};

struct Border sel_off =
{
	-2,-1,5,0,                   /* LeftEdge,TopEdge, Frontpen,BackPen */
	JAM1,5,                      /* DrawMode, Count                    */
	(USHORT *)&updn_data,        /* *XY                                */
        &sel_off2                    /* *NextBorder                        */
};

struct Border sel_on =
{
	-2,-1,5,0,                   /* LeftEdge,TopEdge, Frontpen,BackPen */
	JAM1,15,                     /* DrawMode, Count                    */
	(USHORT *)&selon_data,       /* *XY                                */
        &sel_on_shad                 /* *NextBorder                        */
};

        struct Gadget select1 =
        {
        &plusminus1,44,172,        /* NextGadget, LeftEdge, TopEdge      */
        16,6,GADGHIMAGE,           /* Width, Height, Flags               */
        TOGGLESELECT|GADGIMMEDIATE, /* Activation                        */
        BOOLGADGET,(APTR)&sel_off, /* GadgetType, GadgetRender           */
        (APTR)&sel_on,             /* SelectRender                       */
        NULL, 0,                   /* *GadgetText, MutualExclude         */
        NULL,                      /* SpecialInfo                        */
        HARMON0|SELECT,            /* GadgetID                           */
        NULL                       /* UserData                           */
        };

/*************************************/
/*     Second amplitude gadgets       */
/*************************************/

/*  Proportional gadget  */

struct PropInfo prop_info2 =
{
	AUTOKNOB|FREEVERT,  /* Flags                                  */
	0xFFFF,0xFFFF,      /* HorizPot, VertPot                      */
	0x0800,0x0800,      /* HorizBody, VertBody                    */
	16,64,              /* CWidth,CHeight                         */
	0x0800,0x0800,      /* HPotRes, VPotRes                       */
	0,0                 /* LeftBorder, TopBorder                  */
};

struct IntuiText protext2 =
{
	1, 2, JAM2,         /* FrontPen, BackPen, DrawMode            */
	-20, 3,             /* LeftEdge, TopEdge                      */
	NULL,"2:",          /* *ITextFont, *Itext                     */
	NULL                /* *NextText                              */
};

struct Gadget propor2 =
{
	&select1,139,113,          /* *NextGadget, LeftEdge, TopEdge     */
	14,69,GADGHCOMP|AUTOKNOB,  /* Width, Height, Flags               */
	RELVERIFY|GADGIMMEDIATE,   /* Activation                         */
	PROPGADGET,(APTR)&empty2,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	&protext2,0,               /* *GadgetText, MutualExclude         */
	(APTR)&prop_info2,         /* SpecialInfo                        */
	HARMON1|PROPOR,            /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   Up arrow gadget     */

struct Gadget up2 =
{
	&propor2,118,143,          /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&up_arr, /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON1|UPARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   down arrow gadget  */

struct Gadget dn2 =
{
	&up2,118,152,               /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&dn_arr,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON1|DNARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*  Change sign gadget  */

struct Gadget plusminus2 =
{
	&dn2,118,161,              /* *NextGadget, LeftEdge, TopEdge     */
	15,8,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&plmi5,   /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON1|PLUSMINUS,         /* GadgetID                           */
	NULL                       /* UserData                           */
};

        struct Gadget select2 =
        {
        &plusminus2,118,172,       /* NextGadget, LeftEdge, TopEdge      */
        16,6,GADGHIMAGE,           /* Width, Height, Flags               */
        TOGGLESELECT|GADGIMMEDIATE, /* Activation                        */
        BOOLGADGET,(APTR)&sel_off, /* GadgetType, GadgetRender           */
        (APTR)&sel_on,             /* SelectRender                       */
        NULL, 0,                   /* *GadgetText, MutualExclude         */
        NULL,                      /* SpecialInfo                        */
        HARMON1|SELECT,            /* GadgetID                           */
        NULL                       /* UserData                           */
        };

/*************************************/
/*     Third amplitude gadgets       */
/*************************************/

/*  Proportional gadget  */

struct PropInfo prop_info3 =
{
	AUTOKNOB|FREEVERT,  /* Flags                                  */
	0xFFFF,0xFFFF,      /* HorizPot, VertPot                      */
	0x0800,0x0800,      /* HorizBody, VertBody                    */
	16,64,              /* CWidth,CHeight                         */
	0x0800,0x0800,      /* HPotRes, VPotRes                       */
	0,0                 /* LeftBorder, TopBorder                  */
};

struct IntuiText protext3 =
{
	1, 2, JAM2,         /* FrontPen, BackPen, DrawMode            */
	-20, 3,             /* LeftEdge, TopEdge                      */
	NULL,"3:",          /* *ITextFont, *Itext                     */
	NULL                /* *NextText                              */
};

struct Gadget propor3 =
{
	&select2,213,113,          /* *NextGadget, LeftEdge, TopEdge     */
	14,69,GADGHCOMP|AUTOKNOB,  /* Width, Height, Flags               */
	RELVERIFY|GADGIMMEDIATE,   /* Activation                         */
	PROPGADGET,(APTR)&empty3,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	&protext3,0,               /* *GadgetText, MutualExclude         */
	(APTR)&prop_info3,         /* SpecialInfo                        */
	HARMON2|PROPOR,            /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   Up arrow gadget     */

struct Gadget up3 =
{
	&propor3,192,143,          /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&up_arr, /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON2|UPARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   down arrow gadget  */

struct Gadget dn3 =
{
	&up3,192,152,               /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&dn_arr,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON2|DNARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*  Change sign gadget  */

struct Gadget plusminus3 =
{
	&dn3,192,161,              /* *NextGadget, LeftEdge, TopEdge     */
	15,8,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&plmi5,   /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON2|PLUSMINUS,         /* GadgetID                           */
	NULL                       /* UserData                           */
};

        struct Gadget select3 =
        {
        &plusminus3,192,172,       /* NextGadget, LeftEdge, TopEdge      */
        16,6,GADGHIMAGE,           /* Width, Height, Flags               */
        TOGGLESELECT|GADGIMMEDIATE, /* Activation                        */
        BOOLGADGET,(APTR)&sel_off, /* GadgetType, GadgetRender           */
        (APTR)&sel_on,             /* SelectRender                       */
        NULL, 0,                   /* *GadgetText, MutualExclude         */
        NULL,                      /* SpecialInfo                        */
        HARMON2|SELECT,            /* GadgetID                           */
        NULL                       /* UserData                           */
        };

/*************************************/
/*     Fourth amplitude gadgets      */
/*************************************/

/*  Proportional gadget  */

struct PropInfo prop_info4 =
{
	AUTOKNOB|FREEVERT,  /* Flags                                  */
	0xFFFF,0xFFFF,      /* HorizPot, VertPot                      */
	0x0800,0x0800,      /* HorizBody, VertBody                    */
	16,64,              /* CWidth,CHeight                         */
	0x0800,0x0800,      /* HPotRes, VPotRes                       */
	0,0                 /* LeftBorder, TopBorder                  */
};

struct IntuiText protext4 =
{
	1, 2, JAM2,         /* FrontPen, BackPen, DrawMode            */
	-20, 3,             /* LeftEdge, TopEdge                      */
	NULL,"4:",          /* *ITextFont, *Itext                     */
	NULL                /* *NextText                              */
};

struct Gadget propor4 =
{
	&select3,287,113,          /* *NextGadget, LeftEdge, TopEdge     */
	14,69,GADGHCOMP|AUTOKNOB,  /* Width, Height, Flags               */
	RELVERIFY|GADGIMMEDIATE,   /* Activation                         */
	PROPGADGET,(APTR)&empty4,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	&protext4,0,               /* *GadgetText, MutualExclude         */
	(APTR)&prop_info4,         /* SpecialInfo                        */
	HARMON3|PROPOR,            /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   Up arrow gadget     */

struct Gadget up4 =
{
	&propor4,266,143,          /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&up_arr, /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON3|UPARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   down arrow gadget  */

struct Gadget dn4 =
{
	&up4,266,152,              /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&dn_arr,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON3|DNARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*  Change sign gadget  */

struct Gadget plusminus4 =
{
	&dn4,266,161,              /* *NextGadget, LeftEdge, TopEdge     */
	15,8,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&plmi5,   /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON3|PLUSMINUS,         /* GadgetID                           */
	NULL                       /* UserData                           */
};

        struct Gadget select4 =
        {
        &plusminus4,266,172,       /* NextGadget, LeftEdge, TopEdge      */
        16,6,GADGHIMAGE,           /* Width, Height, Flags               */
        TOGGLESELECT|GADGIMMEDIATE, /* Activation                        */
        BOOLGADGET,(APTR)&sel_off, /* GadgetType, GadgetRender           */
        (APTR)&sel_on,             /* SelectRender                       */
        NULL, 0,                   /* *GadgetText, MutualExclude         */
        NULL,                      /* SpecialInfo                        */
        HARMON3|SELECT,            /* GadgetID                           */
        NULL                       /* UserData                           */
        };

/*************************************/
/*     Fifth amplitude gadgets       */
/*************************************/

/*  Proportional gadget  */

struct PropInfo prop_info5 =
{
	AUTOKNOB|FREEVERT,  /* Flags                                  */
	0xFFFF,0xFFFF,      /* HorizPot, VertPot                      */
	0x0800,0x0800,      /* HorizBody, VertBody                    */
	16,64,              /* CWidth,CHeight                         */
	0x0800,0x0800,      /* HPotRes, VPotRes                       */
	0,0                 /* LeftBorder, TopBorder                  */
};

struct IntuiText protext5 =
{
	1, 2, JAM2,         /* FrontPen, BackPen, DrawMode            */
	-20, 3,             /* LeftEdge, TopEdge                      */
	NULL,"5:",          /* *ITextFont, *Itext                     */
	NULL                /* *NextText                              */
};

struct Gadget propor5 =
{
	&select4,361,113,          /* *NextGadget, LeftEdge, TopEdge     */
	14,69,GADGHCOMP|AUTOKNOB,  /* Width, Height, Flags               */
	RELVERIFY|GADGIMMEDIATE,   /* Activation                         */
	PROPGADGET,(APTR)&empty5,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	&protext5,0,               /* *GadgetText, MutualExclude         */
	(APTR)&prop_info5,         /* SpecialInfo                        */
	HARMON4|PROPOR,            /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   Up arrow gadget     */

struct Gadget up5 =
{
	&propor5,341,143,          /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&up_arr, /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON4|UPARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   down arrow gadget  */

struct Gadget dn5 =
{
	&up5,340,152,               /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&dn_arr,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON4|DNARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*  Change sign gadget  */

struct Gadget plusminus5 =
{
	&dn5,340,161,              /* *NextGadget, LeftEdge, TopEdge     */
	15,8,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&plmi5,   /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON4|PLUSMINUS,         /* GadgetID                           */
	NULL                       /* UserData                           */
};

        struct Gadget select5 =
        {
        &plusminus5,340,172,       /* NextGadget, LeftEdge, TopEdge      */
        16,6,GADGHIMAGE,           /* Width, Height, Flags               */
        TOGGLESELECT|GADGIMMEDIATE, /* Activation                        */
        BOOLGADGET,(APTR)&sel_off, /* GadgetType, GadgetRender           */
        (APTR)&sel_on,             /* SelectRender                       */
        NULL, 0,                   /* *GadgetText, MutualExclude         */
        NULL,                      /* SpecialInfo                        */
        HARMON4|SELECT,            /* GadgetID                           */
        NULL                       /* UserData                           */
        };

/*************************************/
/*     Sixth amplitude gadgets       */
/*************************************/

/*  Proportional gadget  */

struct PropInfo prop_info6 =
{
	AUTOKNOB|FREEVERT,  /* Flags                                  */
	0xFFFF,0xFFFF,      /* HorizPot, VertPot                      */
	0x0800,0x0800,      /* HorizBody, VertBody                    */
	16,64,              /* CWidth,CHeight                         */
	0x0800,0x0800,      /* HPotRes, VPotRes                       */
	0,0                 /* LeftBorder, TopBorder                  */
};

struct IntuiText protext6 =
{
	1, 2, JAM2,         /* FrontPen, BackPen, DrawMode            */
	-20, 3,             /* LeftEdge, TopEdge                      */
	NULL,"6:",          /* *ITextFont, *Itext                     */
	NULL                /* *NextText                              */
};

struct Gadget propor6 =
{
	&select5,435,113,          /* *NextGadget, LeftEdge, TopEdge     */
	14,69,GADGHCOMP|AUTOKNOB,  /* Width, Height, Flags               */
	RELVERIFY|GADGIMMEDIATE,   /* Activation                         */
	PROPGADGET,(APTR)&empty6,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	&protext6,0,               /* *GadgetText, MutualExclude         */
	(APTR)&prop_info6,         /* SpecialInfo                        */
	HARMON5|PROPOR,            /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   Up arrow gadget     */

struct Gadget up6 =
{
	&propor6,414,143,          /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&up_arr, /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON5|UPARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   down arrow gadget  */

struct Gadget dn6 =
{
	&up6,414,152,               /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&dn_arr,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON5|DNARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*  Change sign gadget  */

struct Gadget plusminus6 =
{
	&dn6,414,161,              /* *NextGadget, LeftEdge, TopEdge     */
	15,8,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&plmi5,   /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON5|PLUSMINUS,         /* GadgetID                           */
	NULL                       /* UserData                           */
};

        struct Gadget select6 =
        {
        &plusminus6,414,172,       /* NextGadget, LeftEdge, TopEdge      */
        16,6,GADGHIMAGE,           /* Width, Height, Flags               */
        TOGGLESELECT|GADGIMMEDIATE, /* Activation                        */
        BOOLGADGET,(APTR)&sel_off, /* GadgetType, GadgetRender           */
        (APTR)&sel_on,             /* SelectRender                       */
        NULL, 0,                   /* *GadgetText, MutualExclude         */
        NULL,                      /* SpecialInfo                        */
        HARMON5|SELECT,            /* GadgetID                           */
        NULL                       /* UserData                           */
        };

/*************************************/
/*     Seventh amplitude gadgets     */
/*************************************/

/*  Proportional gadget  */

struct PropInfo prop_info7 =
{
	AUTOKNOB|FREEVERT,  /* Flags                                  */
	0xFFFF,0xFFFF,      /* HorizPot, VertPot                      */
	0x0800,0x0800,      /* HorizBody, VertBody                    */
	16,64,              /* CWidth,CHeight                         */
	0x0800,0x0800,      /* HPotRes, VPotRes                       */
	0,0                 /* LeftBorder, TopBorder                  */
};

struct IntuiText protext7 =
{
	1, 2, JAM2,         /* FrontPen, BackPen, DrawMode            */
	-20, 3,             /* LeftEdge, TopEdge                      */
	NULL,"7:",          /* *ITextFont, *Itext                     */
	NULL                /* *NextText                              */
};

struct Gadget propor7 =
{
	&select6,509,113,          /* *NextGadget, LeftEdge, TopEdge     */
	14,69,GADGHCOMP|AUTOKNOB,  /* Width, Height, Flags               */
	RELVERIFY|GADGIMMEDIATE,   /* Activation                         */
	PROPGADGET,(APTR)&empty7,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	&protext7,0,               /* *GadgetText, MutualExclude         */
	(APTR)&prop_info7,         /* SpecialInfo                        */
	HARMON6|PROPOR,            /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   Up arrow gadget     */

struct Gadget up7 =
{
	&propor7,488,143,          /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&up_arr, /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON6|UPARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   down arrow gadget  */

struct Gadget dn7 =
{
	&up7,488,152,               /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&dn_arr,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON6|DNARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*  Change sign gadget  */

struct Gadget plusminus7 =
{
	&dn7,488,161,              /* *NextGadget, LeftEdge, TopEdge     */
	15,8,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&plmi5,   /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON6|PLUSMINUS,         /* GadgetID                           */
	NULL                       /* UserData                           */
};

        struct Gadget select7 =
        {
        &plusminus7,488,172,       /* NextGadget, LeftEdge, TopEdge      */
        16,6,GADGHIMAGE,           /* Width, Height, Flags               */
        TOGGLESELECT|GADGIMMEDIATE, /* Activation                        */
        BOOLGADGET,(APTR)&sel_off, /* GadgetType, GadgetRender           */
        (APTR)&sel_on,             /* SelectRender                       */
        NULL, 0,                   /* *GadgetText, MutualExclude         */
        NULL,                      /* SpecialInfo                        */
        HARMON6|SELECT,            /* GadgetID                           */
        NULL                       /* UserData                           */
        };

/*************************************/
/*     Eighth amplitude gadgets      */
/*************************************/

/*  Proportional gadget  */

struct PropInfo prop_info8 =
{
	AUTOKNOB|FREEVERT,  /* Flags                                  */
	0xFFFF,0xFFFF,      /* HorizPot, VertPot                      */
	0x0800,0x0800,      /* HorizBody, VertBody                    */
	16,64,              /* CWidth,CHeight                         */
	0x0800,0x0800,      /* HPotRes, VPotRes                       */
	0,0                 /* LeftBorder, TopBorder                  */
};

struct IntuiText protext8 =
{
	1, 2, JAM2,         /* FrontPen, BackPen, DrawMode            */
	-20, 3,             /* LeftEdge, TopEdge                      */
	NULL,"8:",          /* *ITextFont, *Itext                     */
	NULL                /* *NextText                              */
};

struct Gadget propor8 =
{
	&select7,583,113,          /* *NextGadget, LeftEdge, TopEdge     */
	14,69,GADGHCOMP|AUTOKNOB,  /* Width, Height, Flags               */
	RELVERIFY|GADGIMMEDIATE,   /* Activation                         */
	PROPGADGET,(APTR)&empty8,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	&protext8,0,               /* *GadgetText, MutualExclude         */
	(APTR)&prop_info8,         /* SpecialInfo                        */
	HARMON7|PROPOR,            /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   Up arrow gadget     */

struct Gadget up8 =
{
	&propor8,562,143,          /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&up_arr, /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON7|UPARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*   down arrow gadget  */

struct Gadget dn8 =
{
	&up8,562,152,               /* *NextGadget, LeftEdge, TopEdge     */
	16,6,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&dn_arr,  /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON7|DNARROW,           /* GadgetID                           */
	NULL                       /* UserData                           */
};

/*  Change sign gadget  */

struct Gadget plusminus8 =
{
	&dn8,562,161,              /* *NextGadget, LeftEdge, TopEdge     */
	15,8,GADGHCOMP,            /* Width, Height, Flags               */
	GADGIMMEDIATE,             /* Activation                         */
	BOOLGADGET,(APTR)&plmi5,   /* GadgetType, GadgetRender           */
	NULL,                      /* SelectRender                       */
	NULL,0,                    /* *GadgetText, MutualExclude         */
	NULL,                      /* SpecialInfo                        */
	HARMON7|PLUSMINUS,         /* GadgetID                           */
	NULL                       /* UserData                           */
};

        struct Gadget select8 =
        {
        &plusminus8,562,172,       /* NextGadget, LeftEdge, TopEdge      */
        16,6,GADGHIMAGE,           /* Width, Height, Flags               */
        TOGGLESELECT|GADGIMMEDIATE, /* Activation                        */
        BOOLGADGET,(APTR)&sel_off, /* GadgetType, GadgetRender           */
        (APTR)&sel_on,             /* SelectRender                       */
        NULL, 0,                   /* *GadgetText, MutualExclude         */
        NULL,                      /* SpecialInfo                        */
        HARMON7|SELECT,            /* GadgetID                           */
        NULL                       /* UserData                           */
        };

struct Gadget *propadd[8]={&propor1,&propor2,&propor3,&propor4,
	                   &propor5,&propor6,&propor7,&propor8};

/********************/
/*  Menu Structures */
/********************/


struct IntuiText stoptext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Stop",               /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem stopgame = {
	NULL,                      /* *NextItem                          */
	0,20,80,10,                /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&stoptext,     /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct IntuiText hardtext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Start-Hard",         /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem starthard = {
	&stopgame,                 /* *NextItem                          */
	0,10,80,10,                /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&hardtext,     /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct IntuiText easytext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Start-Easy",         /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem starteasy = {
	&starthard,                 /* *NextItem                         */
	0,0,80,10,                 /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&easytext,     /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct Menu game = {
	NULL,                      /* *NextMenu                          */
	161,0,80,10,               /* LeftEdge, TopEdge, Width, Height  */
	MENUENABLED,               /* Flags                              */
	"Game",                    /* *MenuName                          */
	&starteasy                 /* First Item                         */
};

struct IntuiText squaretext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Square",             /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem square = {
	NULL,                      /* *NextItem                          */
	0,30,80,10,                /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&squaretext,   /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct IntuiText sawtext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Sawtooth",           /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem sawtooth = {
	&square,                   /* *NextItem                          */
	0,20,80,10,                /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&sawtext,      /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct IntuiText triangletext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Triangle",           /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem triangle = {
	&sawtooth,                 /* *NextItem                          */
	0,10,80,10,                /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&triangletext, /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct IntuiText resettext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Reset",              /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem resetwave = {
	&triangle,                 /* *NextItem                          */
	0,0,80,10,                 /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&resettext,    /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct Menu waves = {
	&game,                     /* *NextMenu                          */
	81,0,80,10,                /* LeftEdge, TopEdge, Width, Height  */
	MENUENABLED,               /* Flags                              */
	"Waveforms",               /* *MenuName                          */
	&resetwave                 /* First Item                         */
};

struct IntuiText quittext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Quit",               /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem quit = {
	NULL,                      /* *NextItem                          */
	0,40,120,10,                /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&quittext,     /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct IntuiText fronttext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Screen to Front",    /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem scfront = {
	&quit,                     /* *NextItem                          */
	0,30,120,10,               /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&fronttext,    /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct IntuiText backtext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Screen to Back",     /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem scback = {
	&scfront,                  /* *NextItem                          */
	0,20,120,10,               /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&backtext,    /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct IntuiText expandtext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"Full Scale",         /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem expand = {
	&scback,                   /* *NextItem                          */
	0,10,120,10,               /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&expandtext,   /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct IntuiText abouttext = {
	0,1,JAM1,                  /* FrontPen, BackPen, DrawMode        */
	0,0,                       /* LeftEdge, TopEdge                  */
	NULL,"About",              /* ITextFont, *IText                  */
	NULL                       /* *NextText                          */
};

struct MenuItem about = {
	&expand,                   /* *NextItem                          */
	0,0,120,10,                /* LeftEdge, TopEdge, Width, Height   */
	ITEMTEXT|ITEMENABLED|HIGHCOMP, /* Flags                          */
	NULL, (APTR)&abouttext,    /* MutualExclude, ItemFill            */
	NULL,NULL,                 /* Command, *SubItem                  */
	NULL                       /* NextSelect                         */
};

struct Menu project = {
	&waves,                    /* *NextMenu                          */
	0,0,80,10,                 /* LeftEdge, TopEdge, Width, Height   */
	MENUENABLED,               /* Flags                              */
	"Project",                 /* *MenuName                          */
	&about                     /* First Item                         */
};

/****************************************/
/*     "about" requester structures     */
/****************************************/

struct IntuiText OK = {0,1,JAM2,5,4,NULL,"OK",NULL};

struct IntuiText About7 = {0,1,JAM2,8,85,NULL,
	"Click on either <OK> box to proceed",
	NULL};
	
struct IntuiText About6 = {0,1,JAM2,8,70,NULL,
	"                           internet: meyer@iastate.edu",
	&About7};
	
struct IntuiText About5 = {0,1,JAM2,8,60,NULL,
	"Ames, IA, 50011, USA.      BITNET: MEYER@ALISUVAX",
	&About6};
	
struct IntuiText About4 = {0,1,JAM2,8,50,NULL,
	"W. T. Meyer, 12 Physics, Iowa State University,",
	&About5};
	
struct IntuiText About3 = {0,1,JAM2,8,30,NULL,
	"Comments and suggestions may be sent to:",
	&About4};
	
struct IntuiText About2 = {0,1,JAM2,8,20,NULL,
	"Copyright (c) 1990, 1991 by W. T. Meyer.",
	&About3};
	
struct IntuiText About1 = {0,1,JAM2,8,10,NULL,
	"WaveMaker is freely distributable for noncommercial use.",
	&About2};
	
/*************************************/
/*   "Answers" requester structures  */
/*************************************/

char Answers[80];
	
struct IntuiText Answer3 = {0,1,JAM2,8,30,NULL,
	"Click on either <OK> box to proceed",
	NULL};
	
struct IntuiText Answer2 = {0,1,JAM2,8,20,NULL,
	(char *)&Answers,&Answer3};
	
struct IntuiText Answer1 = {0,1,JAM2,8,10,NULL,
	"The answers are:",&Answer2};
	
/************************************************************/
main()
/************************************************************/
{
	ULONG mclass;
	USHORT mcode,mqual,gadID,gadno,gadtyp,i;
	USHORT amptopot();
	unsigned seed;
	LONG pottoamp(),MakeWave();
	SHORT potsign,keyraw,keyup,keyrepeat;
	struct Gadget *mgadget;
	struct PropInfo *propinfo;
	VOID OpenLibs(),WaveCleanup(),MakeDisplay(),MakeSin(),MakePalette();
	VOID AmpsUpDate(),PropUpdate(),DrawBoxes(),DrawUser();
	VOID SoundOn(),SoundOff(),MenuSetup(),DoMenu(),OpenAudio();
	VOID Update(),InitArrays();
	
/*  Initialization  */

	OpenLibs();
	
	OpenAudio();
	
	seed = (unsigned)time(NULL);
	srand(seed);
	
	MakeSin();
	
	for (i=0;i<8;++i) amps[i]=0;
	
	InitArrays();

	MakeDisplay();
	
	SetMenuStrip(Window,&project);
	
  
 /*  Set up an IDCMP Read Loop  */
 
	for(;;) {
	Wait(1<<Window->UserPort->mp_SigBit);
 
	while((mesg=(struct IntuiMessage *)
	   GetMsg(Window->UserPort))!=NULL)  /* Wait for IntuiMessage    */
	{
		mclass = mesg->Class;        /* Run through all of them  */
		mcode = mesg->Code;          /* Local copies of variables*/
		mqual = mesg->Qualifier;
		mgadget =(struct Gadget *)mesg->IAddress;
                switch(mclass)
		{
		   case CLOSEWINDOW: 
		   {
 			WaveCleanup();
			Exit(TRUE);
			break;
		   }
		   case REFRESHWINDOW:
		   {
			DrawBoxes();
			Update(0);
			break;
		   }
		   case MENUPICK:
		   {
			DoMenu(mcode);
			break;
		   }
		   case GADGETDOWN:
		   {
        		gadID = mgadget->GadgetID;
			gadno = gadID&0x7;
			gadtyp = gadID&0x78;
			switch(gadtyp)
			{
			  case UPARROW:
				if (amps[gadno]>=0) ++amps[gadno];
				else --amps[gadno];
				Update(gadno);
				ModifyProp(propadd[gadno],Window,NULL,
				  FREEVERT|AUTOKNOB,0xFFFF,
				  amptopot(amps[gadno]),0x0800,0x0800);
				break;
			  case DNARROW:
				if (amps[gadno]>=0) --amps[gadno];
				else ++amps[gadno];
				Update(gadno);
				ModifyProp(propadd[gadno],Window,NULL,
				  FREEVERT|AUTOKNOB,0xFFFF,
				  amptopot(amps[gadno]),0x0800,0x0800);
				break;
			  case PLUSMINUS:
				amps[gadno]=-amps[gadno];
				Update(gadno);
				break;
			  case PROPOR:
				break;
                          case SELECT:
                                if (selflag & bitval[gadno])
                                  selflag=selflag&bitval[gadno+8];
                                else
                                  selflag = selflag | bitval[gadno];
                                DrawUser();
                                break;
		          }
			  break;
		   }
		   case GADGETUP:
		   {
			gadID = mgadget->GadgetID;
        		gadno = gadID&0x7;
			gadtyp = gadID&0x38;
			switch(gadtyp)
			{
			  case UPARROW:
				break;
			  case DNARROW:
				break;
			  case PLUSMINUS:
				break;
			  case PROPOR:
				potsign=1;
				if (amps[gadno]<0) potsign=-1;
			    propinfo=(struct PropInfo *)mgadget->SpecialInfo;
				amps[gadno]=pottoamp(propinfo->VertPot,
					potsign);
				Update(gadno);
				break;
                          case SELECT:
                                break;
			  }
			  break;
		   }
		   case RAWKEY:
		        keyrepeat=mqual&IEQUALIFIER_REPEAT;
			keyraw = mcode&0x7F;
			keyup = mcode&0x80;
			if (keyup==0&&!keyrepeat) 
				SoundOn(keyraw,usersound);
			if (keyup!=0) SoundOff(keyraw);
			break;
		}
		ReplyMsg(mesg);              /* Give message back        */
	}
	}
}
