// RY30 voice editor, (c) 1998 G. Jones

#include "classmate.h"
#include "waves.h"

#include <devices/serial.h>

#include <stdlib.h>
#include <exec/types.h>
#include <proto/asl.h>
#include <time.h>

int main(int argc, char **argv);
void close_all(void);
int openserial(char *devicename);
void closeserial(void);
BOOL sendsysex(char *packet);
void write(int param);
void setindCH(int display, char *string);
void assign(char *dest, int src, int pos);
void dump(struct RYVoice *voice, BOOL save);
void setsliders(struct RYVoice *voice);
void initvoice(struct RYVoice *voice[], int n);
void randomsound(struct RYVoice *voice[], int voic, BOOL filter, BOOL pitch, BOOL decay_pan, BOOL wave, int osc);
int rnd_num(int max);
BOOL  reqFile(struct RYVoice *voice);
unsigned short int updcrc(unsigned short int,int,unsigned short int);

struct timeval Time;


struct MsgPort  *SerialMP;         /* Message port pointer */
struct IOExtSer *SerialIO;         /* I/O request pointer */

unsigned short int crc16;

struct Node *node;
char *nodename;

BOOL osc1=TRUE;
BOOL osc2=TRUE;
int do_osc = 3;

UBYTE checksum;
int voic=0;

struct TagItem frtags[] =
{
    ASLFR_TitleText,       (ULONG)"Save Sys Ex",
    ASLFR_InitialLeftEdge,     400,
    ASLFR_InitialTopEdge,     300,
    ASLFR_InitialWidth,      250,
    ASLFR_InitialHeight,      400,
    ASLFR_DoSaveMode, TRUE,

    ASLFR_PositiveText,     (ULONG)"Save",
    ASLFR_NegativeText, (ULONG)"Cancel",
    ASLFR_InitialFile,       (ULONG)"voice.syx",
    ASLFR_InitialDrawer,        (ULONG)"ram:",
    TAG_DONE
};

char d_header[]=
{
        0xF0, 0x43, 0x00, 0x7A, 0x00, 0x76
};

char id[]=
{
        'L','M',' ',' ','0','0','1','7',' ',' ',
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00
};

struct RYVoice //=
{
    int src;
    int dest;
    int level;

    int peglevel;
    int pegrate;

    int output;
    int indlevel;

    char name[9];

    int wave1;
    int wave1level;
    int pan1;
    int pitch1;
    int decay1;
    int filter1;
    int cutoff1;
    int res1;
    int eg1level;
    int eg1rate;
    int sen_level1;
    int sen_pitch1;
    int sen_eg1;

    int wave2;
    int wave2level;
    int pan2;
    int pitch2;
    int decay2;
    int filter2;
    int cutoff2;
    int res2;
    int eg2level;
    int eg2rate;
    int sen_level2;
    int sen_pitch2;
    int sen_eg2;

    int group;
    BOOL poly;
};


FILE *voicefile;

struct List     C_Filter1_list, R_Filter1_list, CT_Filter1_list, LB_Filter1_list 
        , C_Alternate_list, R_Alternate_list, CT_Alternate_list, LB_Alternate_list 
        , C_Output_list, R_Output_list, CT_Output_list, LB_Output_list, Wavelist,
        Wavelist2
        ;

UBYTE *Filter1_str[] = { "THRU", "Low Pass 12", "Low Pass 24", "High Pass 12", "High Pass 24", 
        NULL };
UBYTE *Alternate_str[] = { "OFF", "1", "2", "3", "4", 
        "5", "6", "7", NULL };
UBYTE *Output_str[] = { "Stereo", "Stereo + Indv 1", "Stereo + Indv 2", "Indv 1", "Indv 2",
        "Indv 1 & 2", NULL };

struct Screen   *gScreen = NULL;
struct DrawInfo *gDrinfo = NULL;
struct MsgPort  *gApp_port = NULL;
struct Window   *gMain_window = NULL;
struct Gadget   *gMain_Gadgets[ 65 ];
Object          *gWindow_object = NULL;
APTR            gVi;

void setind(int display, int level);

int main(int argc, char **argv)
{
  struct RYVoice *voice[96];
  int i;

  for(i=0; i <96;i++)
  {
    voice[i]=NULL;
  }
  initvoice(voice,0);

  openserial("serial.device");

  gScreen = LockPubScreen( NULL );
  if ( gScreen )
  {
        if (ButtonBase);
        gDrinfo = GetScreenDrawInfo ( gScreen );
        gVi = GetVisualInfo( gScreen, TAG_DONE );
        gApp_port = CreateMsgPort();

        NewList(&Wavelist);
        NewList(&Wavelist2);
        NewList(&C_Filter1_list);
        NewList(&R_Filter1_list);
        NewList(&CT_Filter1_list);
        NewList(&LB_Filter1_list);
        MakeChooserList(&C_Filter1_list, Filter1_str);
        MakeRadioList(&R_Filter1_list, Filter1_str);
        MakeClickTabList(&CT_Filter1_list, Filter1_str);
        MakeListBrowserList1(&LB_Filter1_list, Filter1_str);
        MakeListBrowserList1(&Wavelist, Wave_str);
        MakeListBrowserList1(&Wavelist2, Wave_str);
        NewList(&C_Alternate_list);
        NewList(&R_Alternate_list);
        NewList(&CT_Alternate_list);
        NewList(&LB_Alternate_list);
        MakeChooserList(&C_Alternate_list, Alternate_str);
        MakeRadioList(&R_Alternate_list, Alternate_str);
        MakeClickTabList(&CT_Alternate_list, Alternate_str);
        MakeListBrowserList1(&LB_Alternate_list, Alternate_str);
        NewList(&C_Output_list);
        NewList(&R_Output_list);
        NewList(&CT_Output_list);
        NewList(&LB_Output_list);
        MakeChooserList(&C_Output_list, Output_str);
        MakeRadioList(&R_Output_list, Output_str);
        MakeClickTabList(&CT_Output_list, Output_str);
        MakeListBrowserList1(&LB_Output_list, Output_str);

        gWindow_object = WindowObject,
                WA_ScreenTitle, "RY30 Editor",
                WA_Title, "RY30 Editor v0.5 © G. O. Jones",
                WA_Left, 0,
                WA_Top, 0,
                WA_Height, 300,
                WA_Width, 600,
                WA_MinWidth, 150,
                WA_MaxWidth, 8192,
                WA_MinHeight, 80,
                WA_MaxHeight, 8192,
                WA_InnerWidth, 0,
                WA_InnerHeight, 0,
                WA_CustomScreen, gScreen,
                WINDOW_AppPort, gApp_port,
                WA_CloseGadget, TRUE,
                WA_DepthGadget, TRUE,
                WA_SizeGadget, TRUE,
                WA_SizeBRight, FALSE,
                WA_SizeBBottom, TRUE,
                WA_DragBar, TRUE,
                WA_NoCareRefresh, TRUE,
                WA_IDCMP,
                         IDCMP_GADGETDOWN |  IDCMP_GADGETUP |  IDCMP_CLOSEWINDOW | 
                         0, 
                WINDOW_ParentGroup, VLayoutObject,
                LAYOUT_DeferLayout, TRUE,
                        LAYOUT_AddChild, LayoutObject,
                                LAYOUT_DeferLayout, FALSE,
                                LAYOUT_SpaceOuter, FALSE,
                                LAYOUT_BottomSpacing, 2,
                                LAYOUT_TopSpacing, 2,
                                LAYOUT_LeftSpacing, 2,
                                LAYOUT_RightSpacing, 2,
                                LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
                                LAYOUT_HorizAlignment, LALIGN_LEFT,
                                LAYOUT_VertAlignment, LALIGN_TOP,
                                LAYOUT_BevelState, IDS_SELECTED,
                                LAYOUT_FixedHoriz, TRUE,
                                LAYOUT_FixedVert, TRUE,
                                LAYOUT_SpaceInner, TRUE,

                                LAYOUT_AddChild, HGroupObject,

                                LAYOUT_AddChild, gMain_Gadgets[ 54 ] = ScrollerObject,
                                          GA_ID, 54,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->dest,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 96,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Voice",
                                        LabelEnd,

                                LAYOUT_AddChild, gMain_Gadgets[ 55 ] =ButtonObject,
                                        GA_ID,55,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                ButtonEnd,
                                CHILD_WeightedHeight,0,

                                LayoutEnd,
                                CHILD_WeightedHeight,0,

                                LAYOUT_AddChild, HGroupObject,

                                LAYOUT_AddChild,  gMain_Gadgets[ 5 ] = StringObject,
                                          GA_ID, 5,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          STRINGA_TextVal, voice[0]->name,
                                          STRINGA_MaxChars, 9,
                                        StringEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Voice Name",
                                        LabelEnd,

                                LAYOUT_AddChild, gMain_Gadgets[ 52 ] = ScrollerObject,
                                          GA_ID, 52,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->dest,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 96,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Destination",
                                        LabelEnd,

                               LAYOUT_AddChild, gMain_Gadgets[ 53 ] =ButtonObject,
                                        GA_ID,53,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"I00",
                                ButtonEnd,
                                CHILD_WeightedHeight,0,

                                LayoutEnd,
                                CHILD_WeightedHeight,0,

                            LAYOUT_AddChild, HGroupObject,

                                LAYOUT_AddChild, gMain_Gadgets[ 30 ] = CheckBoxObject,
                                          GA_ID, 30,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          GA_Text, "Reverse",
                                          CHECKBOX_TextPen, 1,
                                          CHECKBOX_BackgroundPen, 0,
                                          CHECKBOX_FillTextPen, 1,
                                          CHECKBOX_TextPlace, PLACETEXT_LEFT,
                                        CheckBoxEnd,

                                 LAYOUT_AddChild, gMain_Gadgets[ 31 ] = CheckBoxObject,
                                          GA_ID, 31,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          GA_Text, "Reverse",
                                          CHECKBOX_TextPen, 1,
                                          CHECKBOX_BackgroundPen, 0,
                                          CHECKBOX_FillTextPen, 1,
                                          CHECKBOX_TextPlace, PLACETEXT_LEFT,
                                        CheckBoxEnd,

                                LAYOUT_AddChild, gMain_Gadgets[ 32 ] = CheckBoxObject,
                                          GA_ID, 32,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          GA_Text, "Off",
                                          CHECKBOX_TextPen, 1,
                                          CHECKBOX_BackgroundPen, 0,
                                          CHECKBOX_FillTextPen, 1,
                                          CHECKBOX_TextPlace, PLACETEXT_LEFT,
                                        CheckBoxEnd,
                                LayoutEnd,
                                CHILD_WeightedHeight,0,


                                LAYOUT_AddChild,  HGroupObject,

                                LAYOUT_AddChild, gMain_Gadgets[ 28 ] =ButtonObject,
                                        GA_ID,28,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"Bass Drum Analog",
                                ButtonEnd,
                                CHILD_WeightedHeight,0,

                                LAYOUT_AddChild, gMain_Gadgets[ 29 ] =ButtonObject,
                                        GA_ID,29,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"Off",
                                ButtonEnd,
                                CHILD_WeightedHeight,0,

                                LayoutEnd,
                                CHILD_WeightedHeight,0,

                                LAYOUT_AddChild, LayoutObject,
                                        LAYOUT_DeferLayout, FALSE,
                                        LAYOUT_SpaceOuter, FALSE,
                                        LAYOUT_BottomSpacing, 2,
                                        LAYOUT_TopSpacing, 2,
                                        LAYOUT_LeftSpacing, 2,
                                        LAYOUT_RightSpacing, 2,
                                        LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
                                        LAYOUT_HorizAlignment, LALIGN_LEFT,
                                        LAYOUT_VertAlignment, LALIGN_TOP,
                                        LAYOUT_BevelState, IDS_SELECTED,
                                        LAYOUT_FixedHoriz, TRUE,
                                        LAYOUT_FixedVert, TRUE,
                                        LAYOUT_SpaceInner, TRUE,

                                        LAYOUT_AddChild, gMain_Gadgets[ 0 ] = ScrollerObject,
                                          GA_ID, 0,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->level,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 64,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_VERT,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "M Level",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,

                                        LAYOUT_AddChild, gMain_Gadgets[ 1 ] = ListBrowserObject,
                                          GA_ID, 1,
                                          GA_RelVerify, TRUE,
                                          LISTBROWSER_Position, 0,
                                          LISTBROWSER_ShowSelected, TRUE,
                                          LISTBROWSER_Selected, voice[0]->wave1+1,
                                          LISTBROWSER_VertSeparators, TRUE,
                                          LISTBROWSER_Separators, TRUE,
                                          LISTBROWSER_Labels, &Wavelist,
                                        ListBrowserEnd,


                                        LAYOUT_AddChild, gMain_Gadgets[ 2 ] = ScrollerObject,
                                          GA_ID, 2,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->wave1level,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 64,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_VERT,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Level 1",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,

                                        LAYOUT_AddChild, gMain_Gadgets[ 3 ] = ListBrowserObject,
                                          GA_ID, 3,
                                          GA_RelVerify, TRUE,
                                          LISTBROWSER_Position, 0,
                                          LISTBROWSER_Selected, voice[0]->wave2+1,
                                          LISTBROWSER_ShowSelected, TRUE,
                                          LISTBROWSER_VertSeparators, TRUE,
                                          LISTBROWSER_Separators, TRUE,
                                          LISTBROWSER_Labels, &Wavelist2,
                                        ListBrowserEnd,

                                        LAYOUT_AddChild, gMain_Gadgets[ 4 ] = ScrollerObject,
                                          GA_ID, 4,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->wave2level,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 64,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_VERT,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Level 2",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,

                                  LayoutEnd,

                                LAYOUT_AddChild, LayoutObject,
                                        LAYOUT_DeferLayout, FALSE,
                                        LAYOUT_SpaceOuter, FALSE,
                                        LAYOUT_BottomSpacing, 2,
                                        LAYOUT_TopSpacing, 2,
                                        LAYOUT_LeftSpacing, 2,
                                        LAYOUT_RightSpacing, 2,
                                        LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
                                        LAYOUT_HorizAlignment, LALIGN_LEFT,
                                        LAYOUT_VertAlignment, LALIGN_TOP,
                                        LAYOUT_BevelState, IDS_SELECTED,
                                        LAYOUT_FixedHoriz, TRUE,
                                        LAYOUT_FixedVert, TRUE,
                                        LAYOUT_SpaceInner, TRUE,

                                        LAYOUT_AddChild, HGroupObject,

                                        LAYOUT_AddChild, VGroupObject,

                                        LAYOUT_AddChild, gMain_Gadgets[ 6 ] = ScrollerObject,
                                          GA_ID, 6,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->pan1,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 33,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Pan 1",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,


                                        LAYOUT_AddChild, gMain_Gadgets[ 8 ] = ScrollerObject,
                                          GA_ID, 8,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->pitch1,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 73,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Pitch 1",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,

                                         LAYOUT_AddChild, gMain_Gadgets[ 10 ] = ScrollerObject,
                                          GA_ID, 10,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->decay1,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 64,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Decay 1",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 12 ] = ChooserObject,
                                          GA_ID, 12,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          CHOOSER_PopUp, TRUE,
                                          CHOOSER_MaxLabels, 5,
                                          CHOOSER_Active, voice[0]->filter1,
                                          CHOOSER_Width, -1,
                                          CHOOSER_Labels, &C_Filter1_list,
                                        ChooserEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Filter 1",
                                        LabelEnd,

                                        LAYOUT_AddChild, gMain_Gadgets[ 14 ] = ScrollerObject,
                                          GA_ID, 14,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->cutoff1,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 128,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Cut Off 1",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                         LAYOUT_AddChild, gMain_Gadgets[ 16 ] = ScrollerObject,
                                          GA_ID, 16,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->res1,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 101,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Res 1",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                         LAYOUT_AddChild, gMain_Gadgets[ 18 ] = ScrollerObject,
                                          GA_ID, 18,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->eg1level,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 129,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "EG Level 1",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,


                                         LAYOUT_AddChild, gMain_Gadgets[ 20 ] = ScrollerObject,
                                          GA_ID, 20,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->eg1rate,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 64,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "EG Rate 1",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                         LAYOUT_AddChild, gMain_Gadgets[ 22 ] = ScrollerObject,
                                          GA_ID, 22,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->peglevel,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 145,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Pitch EG Level",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,


                                         LAYOUT_AddChild, gMain_Gadgets[ 25 ] = ChooserObject,
                                          GA_ID, 25,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          CHOOSER_PopUp, TRUE,
                                          CHOOSER_MaxLabels, 9,
                                          CHOOSER_Active, voice[0]->group,
                                          CHOOSER_Width, -1,
                                          CHOOSER_Labels, &C_Alternate_list,
                                        ChooserEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Alt Group",
                                        LabelEnd,

                                        LAYOUT_AddChild, gMain_Gadgets[ 24 ] = CheckBoxObject,
                                          GA_ID, 24,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          GA_Text, "Polyphonic",
                                          CHECKBOX_TextPen, 1,
                                          CHECKBOX_Checked, voice[0]->poly,
                                          CHECKBOX_BackgroundPen, 0,
                                          CHECKBOX_FillTextPen, 1,
                                          CHECKBOX_TextPlace, PLACETEXT_LEFT,
                                        CheckBoxEnd,

                                         LayoutEnd,

                                        LAYOUT_AddChild, VGroupObject,

                                        LAYOUT_AddChild, gMain_Gadgets[ 33 ] =ButtonObject,
                                        GA_ID,33,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedHeight,0,
                                        CHILD_WeightedWidth,10,

                                         LAYOUT_AddChild, gMain_Gadgets[ 34 ] =ButtonObject,
                                        GA_ID,34,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 35 ] =ButtonObject,
                                        GA_ID,35,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, SpaceObject,
                                        SpaceEnd,

                                         LAYOUT_AddChild, gMain_Gadgets[ 37 ] =ButtonObject,
                                        GA_ID,37,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                         LAYOUT_AddChild, gMain_Gadgets[ 38 ] =ButtonObject,
                                        GA_ID,38,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                         LAYOUT_AddChild, gMain_Gadgets[ 39 ] =ButtonObject,
                                        GA_ID,39,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedHeight,0,
                                        CHILD_WeightedWidth,10,

                                         LAYOUT_AddChild, gMain_Gadgets[ 40 ] =ButtonObject,
                                        GA_ID,40,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedHeight,0,
                                        CHILD_WeightedWidth,10,

                                        LAYOUT_AddChild, gMain_Gadgets[ 36 ] =ButtonObject,
                                        GA_ID,36,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, SpaceObject,
                                        SpaceEnd,

                                        LayoutEnd,

                                        LAYOUT_AddChild, VGroupObject,
                                        LAYOUT_InnerSpacing, 10,


                                        LAYOUT_AddChild, gMain_Gadgets[ 7 ] = ScrollerObject,
                                          GA_ID, 7,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->pan2,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 33,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Pan 2",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 9 ] = ScrollerObject,
                                          GA_ID, 9,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->pitch2,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 73,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Pitch 2",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,

                                        LAYOUT_AddChild, gMain_Gadgets[ 11 ] = ScrollerObject,
                                          GA_ID, 11,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->decay2,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 64,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Decay 2",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 13 ] = ChooserObject,
                                          GA_ID, 13,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          CHOOSER_PopUp, TRUE,
                                          CHOOSER_MaxLabels, 5,
                                          CHOOSER_Active, voice[0]->filter2,
                                          CHOOSER_Labels, &C_Filter1_list,
                                        ChooserEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Filter 2",
                                        LabelEnd,


                                        LAYOUT_AddChild, gMain_Gadgets[ 15 ] = ScrollerObject,
                                          GA_ID, 15,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->cutoff2,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 128,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Cut Off 2",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 17 ] = ScrollerObject,
                                          GA_ID, 17,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->res2,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 101,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Res 2",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 19 ] = ScrollerObject,
                                          GA_ID, 19,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->eg2level,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 129,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "EG Level 2",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 21 ] = ScrollerObject,
                                          GA_ID, 21,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->eg2rate,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 64,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "EG Rate 2",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 23 ] = ScrollerObject,
                                          GA_ID, 23,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->pegrate,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 64,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Pitch EG Rate",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 26 ] = ChooserObject,
                                          GA_ID, 26,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          CHOOSER_PopUp, TRUE,
                                          CHOOSER_MaxLabels, 12,
                                          CHOOSER_Active, voice[0]->output,
                                          CHOOSER_Width, -1,
                                          CHOOSER_Labels, &C_Output_list,
                                        ChooserEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Output Assign",
                                        LabelEnd,


                                        LAYOUT_AddChild, gMain_Gadgets[ 27 ] = ScrollerObject,
                                          GA_ID, 27,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          SCROLLER_Top, voice[0]->indlevel,
                                          SCROLLER_Visible, 1,
                                          SCROLLER_Total, 64,
                                          SCROLLER_ArrowDelta, 1,
                                          SCROLLER_Orientation, SORIENT_HORIZ,
                                        ScrollerEnd,
                                        CHILD_Label, LabelObject,
                                                LABEL_Text, "Indv Level",
                                        LabelEnd,
                                                CHILD_MinHeight, 14,
                                                CHILD_WeightedHeight, 0,

                                        
                                        LayoutEnd,

                                        LAYOUT_AddChild, VGroupObject,

                                        LAYOUT_AddChild, gMain_Gadgets[ 42 ] =ButtonObject,
                                        GA_ID,42,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 43 ] =ButtonObject,
                                        GA_ID,43,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 44 ] =ButtonObject,
                                        GA_ID,44,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, SpaceObject,
                                        SpaceEnd,

                                        LAYOUT_AddChild, gMain_Gadgets[ 46 ] =ButtonObject,
                                        GA_ID,46,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 47 ] =ButtonObject,
                                        GA_ID,47,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 48 ] =ButtonObject,
                                        GA_ID,48,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 49 ] =ButtonObject,
                                        GA_ID,49,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, gMain_Gadgets[ 45 ] =ButtonObject,
                                        GA_ID,45,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                         LAYOUT_AddChild, gMain_Gadgets[ 41 ] =ButtonObject,
                                        GA_ID,41,
                                        GA_ReadOnly, TRUE,
                                        GA_Text,"0",
                                        ButtonEnd,
                                        CHILD_WeightedWidth,10,
                                        CHILD_WeightedHeight,0,

                                        LAYOUT_AddChild, SpaceObject,
                                        SpaceEnd,

                                        LayoutEnd,
                                        LayoutEnd,
                                LayoutEnd,
                        LayoutEnd,

                        LAYOUT_AddChild, HGroupObject,

                        LAYOUT_AddChild, gMain_Gadgets[ 51 ] =ButtonObject,
                                        GA_ID,51,
                                        GA_ReadOnly, FALSE,
                                        GA_RelVerify, TRUE,
                                        GA_Text,"Save Voice As...",
                                        ButtonEnd,
                                        CHILD_WeightedWidth, 0,
                                        CHILD_WeightedHeight,0,

                       LAYOUT_AddChild, gMain_Gadgets[ 56 ] =ButtonObject,
                                        GA_ID,56,
                                        GA_ReadOnly, FALSE,
                                        GA_RelVerify, TRUE,
                                        GA_Text,"Reset Sliders",
                                        ButtonEnd,
                                        CHILD_WeightedWidth, 0,
                                        CHILD_WeightedHeight,0,

                       LAYOUT_AddChild, gMain_Gadgets[ 62 ] = CheckBoxObject,
                                          GA_ID, 62,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          GA_Text, "Osc1",
                                          CHECKBOX_Checked, osc1,
                                          CHECKBOX_TextPen, 1,
                                          CHECKBOX_BackgroundPen, 0,
                                          CHECKBOX_FillTextPen, 1,
                                          CHECKBOX_TextPlace, PLACETEXT_LEFT,
                                        CheckBoxEnd,

                       LAYOUT_AddChild, gMain_Gadgets[ 63 ] = CheckBoxObject,
                                          GA_ID, 63,
                                          GA_RelVerify, TRUE,
                                          GA_TabCycle, TRUE,
                                          GA_Text, "Osc2",
                                          CHECKBOX_Checked, osc2,
                                          CHECKBOX_TextPen, 1,
                                          CHECKBOX_BackgroundPen, 0,
                                          CHECKBOX_FillTextPen, 1,
                                          CHECKBOX_TextPlace, PLACETEXT_LEFT,
                                        CheckBoxEnd,

                        LAYOUT_AddChild, gMain_Gadgets[ 57 ] =ButtonObject,
                                        GA_ID,57,
                                        GA_ReadOnly, FALSE,
                                        GA_RelVerify, TRUE,
                                        GA_Text,"Randomise Voice",
                                        ButtonEnd,
                                        CHILD_WeightedWidth, 0,
                                        CHILD_WeightedHeight,0,

                       LAYOUT_AddChild, gMain_Gadgets[ 64 ] =ButtonObject,
                                        GA_ID,64,
                                        GA_ReadOnly, FALSE,
                                        GA_RelVerify, TRUE,
                                        GA_Text,"Randomise BANK!",
                                        ButtonEnd,
                                        CHILD_WeightedWidth, 0,
                                        CHILD_WeightedHeight,0,


                       LayoutEnd,
                       CHILD_WeightedHeight,0,


                       LAYOUT_AddChild, HGroupObject,

                       LAYOUT_AddChild, gMain_Gadgets[ 58 ] =ButtonObject,
                                        GA_ID,58,
                                        GA_ReadOnly, FALSE,
                                        GA_RelVerify, TRUE,
                                        GA_Text,"Randomise Wave",
                                        ButtonEnd,
                                        CHILD_WeightedWidth, 0,
                                        CHILD_WeightedHeight,0,

                       LAYOUT_AddChild, gMain_Gadgets[ 59 ] =ButtonObject,
                                        GA_ID,59,
                                        GA_ReadOnly, FALSE,
                                        GA_RelVerify, TRUE,
                                        GA_Text,"Randomise Pitch",
                                        ButtonEnd,
                                        CHILD_WeightedWidth, 0,
                                        CHILD_WeightedHeight,0,

                       LAYOUT_AddChild, gMain_Gadgets[ 60 ] =ButtonObject,
                                        GA_ID,60,
                                        GA_ReadOnly, FALSE,
                                        GA_RelVerify, TRUE,
                                        GA_Text,"Randomise Filter",
                                        ButtonEnd,
                                        CHILD_WeightedWidth, 0,
                                        CHILD_WeightedHeight,0,

                       LAYOUT_AddChild, gMain_Gadgets[ 61 ] =ButtonObject,
                                        GA_ID,61,
                                        GA_ReadOnly, FALSE,
                                        GA_RelVerify, TRUE,
                                        GA_Text,"Randomise Pan/Decay",
                                        ButtonEnd,
                                        CHILD_WeightedWidth, 0,
                                        CHILD_WeightedHeight,0,

                       LayoutEnd,
                       CHILD_WeightedHeight,0,

                LayoutEnd,
        WindowEnd;

        if ( gWindow_object )
        {
          if ( gMain_window = (struct Window *) CA_OpenWindow( gWindow_object ))
          {
                WORD Code;
                char buff[15];
                
                char *name;
                ULONG wait = 0, signal = 0, result = 0, done = FALSE;
                GetAttr( WINDOW_SigMask, gWindow_object, &signal );

                while ( !done)
                {
                  wait = Wait( signal | SIGBREAKF_CTRL_C );

                  if ( wait & SIGBREAKF_CTRL_C )
                        done = TRUE;
                  else
                  while (( result = CA_HandleInput( gWindow_object, &Code )) != WMHI_LASTMSG)
                  {
                        switch ( result & WMHI_CLASSMASK )
                        {
                          case WMHI_CLOSEWINDOW:
                                done = TRUE;
                                break;

                          case WMHI_GADGETUP:
                                switch( result & WMHI_GADGETMASK )
                                {
                                  case 0:       // Scroller Voice Level

                                        voice[voic]->level = Code;
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 1:       // ListBrowser _ListBrowser1

                                        voice[voic]->wave1 = Code;

                                        GetAttr(LISTBROWSER_SelectedNode, gMain_Gadgets[ 1 ], (ULONG *)&node);

                                        GetListBrowserNodeAttrs(node, LBNCA_Text, &nodename,
                                            TAG_END);

                                        SetGadgetAttrs(gMain_Gadgets[28], gMain_window, NULL,
                                        GA_Text, nodename,
                                        TAG_DONE);

                                        dump(voice[voic], TRUE);
                                        break;

                                  case 2:       // Scroller Wave 1 Level

                                        voice[voic]->wave1level = Code;

                                        dump(voice[voic], TRUE);
                                        break;

                                  case 3:       // ListBrowser _ListBrowser2

                                        voice[voic]->wave2 = Code;

                                        GetAttr(LISTBROWSER_SelectedNode, gMain_Gadgets[ 3 ], (ULONG *)&node);

                                        GetListBrowserNodeAttrs(node, LBNCA_Text, &nodename,
                                            TAG_END);

                                        SetGadgetAttrs(gMain_Gadgets[29], gMain_window, NULL,
                                        GA_Text, nodename,
                                        TAG_DONE);

                                        dump(voice[voic], TRUE);
                                        break;

                                  case 4:       // Scroller Wave 2 Level

                                        voice[voic]->wave2level = Code;

                                        dump(voice[voic], TRUE);
                                        break;

                                  case 5:       // String Voice Name
                                        GetAttr(STRINGA_TextVal, gMain_Gadgets[ 5 ], (ULONG *)&name);
                                        strcpy(voice[voic]->name,name);

                                        dump(voice[voic], TRUE);
                                        break;

                                  case 6:       // Scroller Pan 1

                                        voice[voic]->pan1 = Code;
                                        setind(33,Code-16);  //6
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 7:       // Scroller Pan 2

                                        voice[voic]->pan2 = Code;
                                        setind(42,Code-16);  //7
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 8:       // Scroller Pitch 1
                                        voice[voic]->pitch1 = Code;
                                        setind(34,Code-36);  //8
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 9:       // Scroller Pitch 2
                                        voice[voic]->pitch2 = Code;
                                        setind(43,Code-36);   //9
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 10:      // Scroller Decay 1
                                        voice[voic]->decay1 = Code;
                                        setind(35,Code);     //10
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 11:      // Scroller Decay 2
                                        voice[voic]->decay2 = Code;
                                        setind(44,Code);     //11
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 12:      // Chooser Filter 1
                                        voice[voic]->filter1 = Code;
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 13:      // Chooser Filter 2
                                        voice[voic]->filter2 = Code;
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 14:      // Scroller Cut Off 1
                                        voice[voic]->cutoff1 = Code;
                                        setind(37,Code);       //14
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 15:      // Scroller Cut Off 2
                                        voice[voic]->cutoff2 = Code;
                                        setind(46,Code);       //15
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 16:      // Scroller Res 1
                                        voice[voic]->res1 = Code;
                                        setind(38,Code);         //16
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 17:      // Scroller Res 2
                                        voice[voic]->res2 = Code;
                                       setind(47,Code);         //17
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 18:      // Scroller EG Level 1
                                        voice[voic]->eg1level = Code;
                                        setind(39,Code-64);      //18
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 19:      // Scroller EG Level 2
                                        voice[voic]->eg2level = Code;
                                        setind(48,Code-64);    //19
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 20:      // Scroller EG Rate 1
                                        voice[voic]->eg1rate = Code;
                                        setind(40,Code);           //20
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 21:      // Scroller EG Rate 2
                                        voice[voic]->eg2rate = Code;
                                        setind(49,Code);        //21
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 22:      // Scroller Pitch EG Level
                                        voice[voic]->peglevel = Code;
                                        setind(36,Code-72);     //22
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 23:      // Scroller Pitch EG Rate
                                        voice[voic]->pegrate = Code;
                                        setind(45,Code);        //23
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 24:      // CheckBox Polyphonic
                                        if (Code) voice[voic]->poly=TRUE;
                                        else voice[voic]->poly=FALSE;
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 25:      // Chooser Alt Group
                                        voice[voic]->group= Code;
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 26:      // Chooser Output Assign
                                        voice[voic]->output = Code;
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 27:      // Scroller Indv Level
                                        voice[voic]->indlevel = Code;
                                        setind(41,Code);        //27
                                        dump(voice[voic], TRUE);
                                        break;

                                  case 32:

                                    if (Code == 1)
                                    {
                                       
                                       SetGadgetAttrs(gMain_Gadgets[3], gMain_window, NULL,
                                       GA_Disabled, TRUE,
                                       TAG_DONE);

                                       SetGadgetAttrs(gMain_Gadgets[29], gMain_window, NULL,
                                       GA_Text, "Off",
                                       TAG_DONE);
                                    }
                                    else
                                    {
                                       SetGadgetAttrs(gMain_Gadgets[3], gMain_window, NULL,
                                       GA_Disabled, FALSE,
                                       TAG_DONE);

                                       GetAttr(LISTBROWSER_SelectedNode, gMain_Gadgets[ 3 ], (ULONG *)&node);

                                        if (node)
                                        {
                                        GetListBrowserNodeAttrs(node, LBNCA_Text, &nodename,
                                            TAG_END);

                                        SetGadgetAttrs(gMain_Gadgets[29], gMain_window, NULL,
                                        GA_Text, nodename,
                                        TAG_DONE);
                                        }
                                    }
                                    break;

                                case 51:

                                  reqFile(voice[voic]);
                                break;

                                case 52:
                                voice[voic]->dest = Code;
                                sprintf(buff,"I%02ld",Code);
                                setindCH(53,buff);      //52
                                break;

                                case 53:
                                break;

                                case 54:
                                voic=Code;

                                if(!voice[voic]) initvoice(voice,voic);

                                setsliders(voice[voic]);
                                setind(55,Code);
                                 break;

                                case 56:
                                initvoice(voice,voic);
                                setsliders(voice[voic]);
                                break;

                                case 57:
                                randomsound(voice, voic, TRUE, TRUE, TRUE, TRUE, do_osc);
                                setsliders(voice[voic]);
                                dump(voice[voic], TRUE);
                                break;

                                case 58:        //    wave
                                randomsound(voice, voic, FALSE, FALSE, FALSE, TRUE, do_osc);
                                setsliders(voice[voic]);
                                dump(voice[voic], TRUE);
                                   break;
                                case 59:        // pitch
                                randomsound(voice, voic, FALSE, TRUE, FALSE, FALSE, do_osc);
                                setsliders(voice[voic]);
                                dump(voice[voic], TRUE);
                                    break;
                                case 60:        // filter
                                randomsound(voice, voic, TRUE, FALSE, FALSE, FALSE, do_osc);
                                setsliders(voice[voic]);
                                dump(voice[voic], TRUE);
                                    break;
                                case 61:       // pan/decay
                                randomsound(voice, voic, FALSE, FALSE, TRUE, FALSE, do_osc);
                                setsliders(voice[voic]);
                                dump(voice[voic], TRUE);
                                    break;
                                case 62:         // osc 1
                                   if (Code) do_osc+=1;
                                   else do_osc-=1;

                                    break;
                                case 63:        // osc2
                                   if (Code) do_osc+=2;
                                   else do_osc-=2;
                                    break;

                                case 64:

                                for(i=0; i<96; i++)
                                {
                                    if(!voice[i]) initvoice(voice,i);
                                    randomsound(voice, i, TRUE, TRUE, TRUE, TRUE, do_osc);
                                    setsliders(voice[i]);
                                    SetGadgetAttrs(gMain_Gadgets[54], gMain_window, NULL,
                                    SCROLLER_Top, i,
                                    TAG_DONE);
                                    setind(55,i);
                                    sprintf(buff,"RND %02d  ",i);
                                    strcpy(voice[i]->name,buff);
                                    SetGadgetAttrs(gMain_Gadgets[5], gMain_window, NULL,
                                    STRINGA_TextVal, voice[i]->name,
                                    TAG_DONE);
                                    voice[i]->dest = i;
                                    dump(voice[i], TRUE);
                                }

                                break;

          //-----------------------------------------------------------------------------------------------
                                }
                                break;

                        }            
                  }
                }
          }
        }

        for(i=0; i<96;i++)
        {
          if (voice[i])  FreeVec(voice[i]);
        }
        closeserial();
        close_all();
  }
  return(0);
}

void close_all( void )
{
  FreeChooserList(&C_Filter1_list);
  FreeRadioList(&R_Filter1_list);
  FreeClickTabList(&CT_Filter1_list);
  FreeListBrowserList(&LB_Filter1_list);
    FreeListBrowserList(&Wavelist);
    FreeListBrowserList(&Wavelist2);

  FreeChooserList(&C_Alternate_list);
  FreeRadioList(&R_Alternate_list);
  FreeClickTabList(&CT_Alternate_list);
  FreeListBrowserList(&LB_Alternate_list);
  FreeChooserList(&C_Output_list);
  FreeRadioList(&R_Output_list);
  FreeClickTabList(&CT_Output_list);
  FreeListBrowserList(&LB_Output_list);
  if ( gApp_port )
        DeleteMsgPort( gApp_port );
  if ( gDrinfo )
        FreeScreenDrawInfo( gScreen, gDrinfo);
  if ( gVi )
        FreeVisualInfo( gVi );
  if ( gScreen )
        UnlockPubScreen(0, gScreen );
  if ( gWindow_object )
  {
        DisposeObject( gWindow_object );
        gWindow_object = NULL;
        gMain_window = NULL;
  }
}

void setind(int display, int level)
{
    char buff[10];

    sprintf(buff,"%d",level);

    SetGadgetAttrs(gMain_Gadgets[display], gMain_window, NULL,
                    GA_Text, buff,
                    TAG_DONE);
}

void setindCH(int display, char *string)
{
    SetGadgetAttrs(gMain_Gadgets[display], gMain_window, NULL,
                    GA_Text, string,
                    TAG_DONE);
}

int openserial(char *devicename)
{
    UWORD status;  
    UBYTE *user;
        if (SerialMP=CreatePort(NULL,NULL) )
        {
            if (SerialIO=(struct IOExtSer *)CreateExtIO(SerialMP,sizeof(struct IOExtSer)) )
            {
                if (OpenDevice(devicename,0L,(struct IORequest *)SerialIO,0))
                {
                    printf("\n%s did not open",devicename);
                    return 0;
                }
                else
                {
                    SerialIO->IOSer.io_Command  = SDCMD_QUERY;
                    DoIO((struct IORequest *)SerialIO);             /* execute query */

                    status = SerialIO->io_Status;                    /* store returned status */

                    SerialIO->IOSer.io_Command  = SDCMD_SETPARAMS;
                    SerialIO->io_SerFlags &= ~SERF_PARTY_ON;
                    SerialIO->io_SerFlags|=(SERF_RAD_BOOGIE|SERF_XDISABLED);
                    SerialIO->io_Baud = 31250;
                    DoIO((struct IORequest *)SerialIO);

                }
            }
            else return 1;
        }
        else return 2;
}

void closeserial(void)
{
    if (SerialIO)
    {
        CloseDevice((struct IORequest *)SerialIO);
        DeleteExtIO((struct IORequest *)SerialIO);
        DeletePort(SerialMP);
    }
}

BOOL sendsysex(char *packet)
{
    SerialIO->IOSer.io_Length=126;
    SerialIO->IOSer.io_Data=(APTR)packet;
    SerialIO->IOSer.io_Command=CMD_WRITE;
    if (DoIO((struct IORequest *)SerialIO))
      return (DOSTRUE);
    return DOSFALSE;
}

void initvoice(struct RYVoice *voice[], int n)
{

    if (!voice[n]) voice[n] = AllocVec(sizeof(struct RYVoice),MEMF_CLEAR|MEMF_PUBLIC);

    voice[n]->src=0;
    voice[n]->dest=0;
    voice[n]->level=63;

    voice[n]->peglevel=72;
    voice[n]->pegrate=0;

    voice[n]->output=0;
    voice[n]->indlevel=63;

    strcpy(voice[n]->name,"No Name1");

    voice[n]->wave1=0;
    voice[n]->wave1level=63;
    voice[n]->pan1=16;
    voice[n]->pitch1=36;
    voice[n]->decay1=63;
    voice[n]->filter1=0;
    voice[n]->cutoff1=0;
    voice[n]->res1=80;
    voice[n]->eg1level=64;
    voice[n]->eg1rate=00;
    voice[n]->sen_level1=0;
    voice[n]->sen_pitch1=0;
    voice[n]->sen_eg1=0;

    voice[n]->wave2=0;
    voice[n]->wave2level=63;
    voice[n]->pan2=16;
    voice[n]->pitch2=36;
    voice[n]->decay2=63;
    voice[n]->filter2=0;
    voice[n]->cutoff2=0;
    voice[n]->res2=80;
    voice[n]->eg2level=64;
    voice[n]->eg2rate=00;
    voice[n]->sen_level2=0;
    voice[n]->sen_pitch2=0;
    voice[n]->sen_eg2=0;

    voice[n]->group=0;
    voice[n]->poly=TRUE;
}

void dump(struct RYVoice *voice, BOOL midi)
{
    int i;
    int temp=0;
    char tempb[20];
    char *name;
    char buffer[130];
    char tmp[2];
    char timp[6];
    char t;
    LONG tmp1;
    LONG sum;
    LONG loop;

    GetAttr(STRINGA_TextVal, gMain_Gadgets[ 5 ], (ULONG *)&name);
                                  strcpy(voice->name,name);

    checksum = 0;


    if ((strlen(name))< 8)
    {
        for(i=strlen(voice->name); i<8; i++)
        {
            voice->name[i] = ' ';
        }
    }

    for(i=0;i< 6; i++)
    buffer[i] = (char) d_header[i];

    for(i=0;i< 24; i++)
    buffer[6+i] = (char) id[i];

    buffer[30] = (char)voice->src;
    buffer[31] = (char)voice->dest;

    assign(buffer, voice->level,32);
    assign(buffer,voice->peglevel,34);
    assign(buffer,voice->pegrate,36);

    temp=(voice->group*10)+voice->output;

    if (voice->poly) temp+=0x80;

    assign(buffer,temp,38);
    assign(buffer,voice->indlevel,40);

    for(i=0;i<8;i++)
    {
        sprintf(timp,"%X",voice->name[i]);
        buffer[42+(i*2)] = timp[0];
        buffer[42+1+(i*2)] = timp[1];
    }

    assign(buffer,255,58);
    assign(buffer,255,60);
    assign(buffer,255,62);

    assign(buffer,voice->wave1,64);
    assign(buffer,voice->wave1level,66);
    assign(buffer,voice->pan1,68);
    assign(buffer,voice->pitch1,70);
    assign(buffer,0,72);
    assign(buffer, voice->decay1,74);
    assign(buffer, voice->filter1,76);
    assign(buffer, voice->cutoff1,78);
    assign(buffer, voice->res1,80);
    assign(buffer, voice->eg1level,82);
    assign(buffer, voice->eg1rate,84);
    assign(buffer, voice->sen_level1,86);
    assign(buffer, voice->sen_pitch1,88);
    assign(buffer, voice->sen_eg1,90);
    assign(buffer,0,92);
    assign(buffer, voice->wave2,94);
    assign(buffer, voice->wave2level,96);
    assign(buffer, voice->pan2,98);
    assign(buffer, voice->pitch2,100);
    assign(buffer,0,102);
    assign(buffer, voice->decay2,104);
    assign(buffer, voice->filter2,106);
    assign(buffer, voice->cutoff2,108);
    assign(buffer, voice->res2,110);
    assign(buffer, voice->eg2level,112);
    assign(buffer, voice->eg2rate,114);
    assign(buffer, voice->sen_level2,116);
    assign(buffer, voice->sen_pitch2,118);
    assign(buffer, voice->sen_eg2,120);
    assign(buffer,0,122);

    

    checksum=0;
    sum=0;

    for(tmp1=6; tmp1<124; tmp1++)
    {
        sum+= buffer[tmp1];
    }


        checksum=(UBYTE)(-sum& 0x7f);
    buffer[124]=checksum;
    buffer[125]=0xF7;

    if(!midi)
    {
        for(tmp1=0; tmp1<126;tmp1++)
        {
            fprintf(voicefile,"%c",buffer[tmp1]);
        }
    }
    else sendsysex(buffer);
}

void assign(char *dest, int src, int pos)
{
    char tmp[6];

    sprintf(tmp,"%02X",src);
    dest[pos] = tmp[0];
    dest[pos+1]= tmp[1];
}

void setsliders(struct RYVoice *voice)
{
  char buff[5];
  SetGadgetAttrs(gMain_Gadgets[52], gMain_window, NULL,
                    SCROLLER_Top, voice->dest,
                    TAG_DONE);
            sprintf(buff,"I%02ld",voice->dest);
                                setindCH(53,buff);      //52

  SetGadgetAttrs(gMain_Gadgets[0], gMain_window, NULL,
                    SCROLLER_Top, voice->level,
                    TAG_DONE);
  SetGadgetAttrs(gMain_Gadgets[22], gMain_window, NULL,
                    SCROLLER_Top, voice->peglevel,
                    TAG_DONE);
                    setind(36,voice->peglevel-72);     //22
  SetGadgetAttrs(gMain_Gadgets[23], gMain_window, NULL,
                    SCROLLER_Top, voice->pegrate,
                    TAG_DONE);
                      setind(45,voice->pegrate);        //23
  SetGadgetAttrs(gMain_Gadgets[26], gMain_window, NULL,
                    CHOOSER_Active, voice->output,
                    TAG_DONE);
  SetGadgetAttrs(gMain_Gadgets[27], gMain_window, NULL,
                    SCROLLER_Top, voice->indlevel,
                    TAG_DONE);
                   setind(41,voice->indlevel);        //27
  SetGadgetAttrs(gMain_Gadgets[1], gMain_window, NULL,
                    LISTBROWSER_Selected, voice->wave1,
                    LISTBROWSER_MakeVisible,voice->wave1,
                    TAG_DONE);
  SetGadgetAttrs(gMain_Gadgets[2], gMain_window, NULL,
                    SCROLLER_Top, voice->wave1level,
                    TAG_DONE);
  SetGadgetAttrs(gMain_Gadgets[6], gMain_window, NULL,
                    SCROLLER_Top, voice->pan1,
                    TAG_DONE);
   setind(33,voice->pan1-16);  //6

  SetGadgetAttrs(gMain_Gadgets[8], gMain_window, NULL,
                    SCROLLER_Top, voice->pitch1,
                    TAG_DONE);
   setind(34,voice->pitch1-36);  //8
  SetGadgetAttrs(gMain_Gadgets[10], gMain_window, NULL,
                    SCROLLER_Top, voice->decay1,
                    TAG_DONE);
          setind(35,voice->decay1);     //10
  SetGadgetAttrs(gMain_Gadgets[12], gMain_window, NULL,
                    CHOOSER_Active, voice->filter1,
                    TAG_DONE);
  SetGadgetAttrs(gMain_Gadgets[14], gMain_window, NULL,
                    SCROLLER_Top, voice->cutoff1,
                    TAG_DONE);
                   setind(37,voice->cutoff1);       //14
  SetGadgetAttrs(gMain_Gadgets[16], gMain_window, NULL,
                    SCROLLER_Top, voice->res1,
                    TAG_DONE);
            setind(38,voice->res1);         //16
  SetGadgetAttrs(gMain_Gadgets[18], gMain_window, NULL,
                    SCROLLER_Top, voice->eg1level,
                    TAG_DONE);
                    setind(39,voice->eg1level-64);      //18
  SetGadgetAttrs(gMain_Gadgets[20], gMain_window, NULL,
                    SCROLLER_Top, voice->eg1rate,
                    TAG_DONE);
               setind(40,voice->eg1rate);           //20
  SetGadgetAttrs(gMain_Gadgets[3], gMain_window, NULL,
                    LISTBROWSER_Selected, voice->wave2,
                    LISTBROWSER_MakeVisible,voice->wave2,
                    TAG_DONE);
  SetGadgetAttrs(gMain_Gadgets[4], gMain_window, NULL,
                    SCROLLER_Top, voice->wave2level,
                    TAG_DONE);

  SetGadgetAttrs(gMain_Gadgets[7], gMain_window, NULL,
                    SCROLLER_Top, voice->pan2,
                    TAG_DONE);
    setind(42,voice->pan2-16);  //7
  SetGadgetAttrs(gMain_Gadgets[9], gMain_window, NULL,
                    SCROLLER_Top, voice->pitch2,
                    TAG_DONE);
     setind(43,voice->pitch2-36);   //9
  SetGadgetAttrs(gMain_Gadgets[11], gMain_window, NULL,
                    SCROLLER_Top, voice->decay2,
                    TAG_DONE);
              setind(44,voice->decay2);     //11
  SetGadgetAttrs(gMain_Gadgets[13], gMain_window, NULL,
                    CHOOSER_Active, voice->filter2,
                    TAG_DONE);
  SetGadgetAttrs(gMain_Gadgets[15], gMain_window, NULL,
                    SCROLLER_Top, voice->cutoff2,
                    TAG_DONE);
             setind(46,voice->cutoff2);       //15
  SetGadgetAttrs(gMain_Gadgets[17], gMain_window, NULL,
                    SCROLLER_Top, voice->res2,
                    TAG_DONE);
                       setind(47,voice->res2);         //17
  SetGadgetAttrs(gMain_Gadgets[19], gMain_window, NULL,
                    SCROLLER_Top, voice->eg2level,
                    TAG_DONE);
              setind(48,voice->eg2level-64);    //19
  SetGadgetAttrs(gMain_Gadgets[21], gMain_window, NULL,
                    SCROLLER_Top, voice->eg2rate,
                    TAG_DONE);
                   setind(49,voice->eg2rate);        //21
  SetGadgetAttrs(gMain_Gadgets[25], gMain_window, NULL,
                    CHOOSER_Active, voice->group,
                    TAG_DONE);

  SetGadgetAttrs(gMain_Gadgets[5], gMain_window, NULL,
                    STRINGA_TextVal, voice->name,
                    TAG_DONE);

  if (voice->poly)
  {
  SetGadgetAttrs(gMain_Gadgets[24], gMain_window, NULL,
                    CHECKBOX_Checked, TRUE,
                    TAG_DONE);
  }
  else
  {
    SetGadgetAttrs(gMain_Gadgets[24], gMain_window, NULL,
                    CHECKBOX_Checked, FALSE,
                    TAG_DONE);
  }


GetAttr(LISTBROWSER_SelectedNode, gMain_Gadgets[ 1 ], (ULONG *)&node);

                                        GetListBrowserNodeAttrs(node, LBNCA_Text, &nodename,
                                            TAG_END);

                                        SetGadgetAttrs(gMain_Gadgets[28], gMain_window, NULL,
                                        GA_Text, nodename,
                                        TAG_DONE);

GetAttr(LISTBROWSER_SelectedNode, gMain_Gadgets[ 3 ], (ULONG *)&node);

                                        GetListBrowserNodeAttrs(node, LBNCA_Text, &nodename,
                                            TAG_END);

                                        SetGadgetAttrs(gMain_Gadgets[29], gMain_window, NULL,
                                        GA_Text, nodename,
                                        TAG_DONE);

}

void randomsound(struct RYVoice *voice[], int voic, BOOL filter, BOOL pitch, BOOL decay_pan, BOOL wave, int osc)
{

    if(pitch)
    {
        voice[voic]->peglevel=rnd_num(144);
        voice[voic]->pegrate=rnd_num(64);
    }

    if ((osc==1) || (osc ==3))
    {
        if (wave) voice[voic]->wave1=rnd_num(90);

        if(decay_pan)
        {
            voice[voic]->pan1=rnd_num(32);
            voice[voic]->decay1=rnd_num(63);
        }

        if(pitch)voice[voic]->pitch1=rnd_num(72);
        
        if(filter)
        {
            voice[voic]->filter1=rnd_num(5);
            voice[voic]->cutoff1=rnd_num(128);
            voice[voic]->res1=rnd_num(100);
            voice[voic]->eg1level=rnd_num(128);
            voice[voic]->eg1rate=rnd_num(64);
        }

        voice[voic]->sen_level1=rnd_num(7);
        voice[voic]->sen_pitch1=rnd_num(7);
        voice[voic]->sen_eg1=rnd_num(7);
    }

    if((osc==2) || (osc==3))
    {
        if(wave)voice[voic]->wave2=rnd_num(90);

        if(decay_pan)
        {
        voice[voic]->pan2=rnd_num(32);
        voice[voic]->decay2=rnd_num(63);
        }
        if (pitch) voice[voic]->pitch2=rnd_num(72);
        
        if(filter)
        {
        voice[voic]->filter2=rnd_num(5);
        voice[voic]->cutoff2=rnd_num(128);
        voice[voic]->res2=rnd_num(100);
        voice[voic]->eg2level=rnd_num(128);
        voice[voic]->eg2rate=rnd_num(64);
        }

        voice[voic]->sen_level2=rnd_num(7);
        voice[voic]->sen_pitch2=rnd_num(7);
        voice[voic]->sen_eg2=rnd_num(7);
    }

    if (rnd_num(64) < 32) voice[voic]->poly=TRUE;
    else    voice[voic]->poly=FALSE;

}

int rnd_num(int max)
{
int i;
LONG j;
double k;

        srand(rand()*rand());
        j=rand();
        k=(double)j/2147483647;
        j=(LONG)(k*max);

return (int)j;
}

BOOL  reqFile(struct RYVoice *voice)
{
    struct FileRequester *fr;
    char filename[127];
    

    if (fr = (struct FileRequester *)
            AllocAslRequest(ASL_FileRequest, frtags))
        {
            if (AslRequest(fr, NULL))
            {
                strcpy(filename, fr->rf_Dir);
                AddPart(filename,fr->rf_File, 100);
                FreeAslRequest(fr);

                voicefile = fopen(filename,"wb");
                dump(voice, FALSE);
                fclose(voicefile);
                return TRUE;
            }
        }

                FreeAslRequest(fr);
                return FALSE;

}



       
     
    
     
       
      
        
       
      
        
                             
