// bnkdemo.h
// $Id$

#include <exec/types.h>
#include <exec/memory.h>
#include <exec/semaphores.h>
#include <intuition/gadgetclass.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/asl.h>
#include <clib/macros.h>

#include "/xappmsg.h"
#include "mydebug.h"


enum GadgetID {
    UPLOAD_ID,
    DOWNLOAD_ID,
    LOAD_ID,
    SAVE_ID,
    SETPART_ID,
    SETPRG_ID,
    UNIT_ID,
    PROGRAM_ID,
    PART_ID,
    TONE_ID,
    TONENAME_ID,
    SPARTIAL1_ID,
    SPARTIAL2_ID,
    ENVMODE_ID,
    PARTIALMUTE_ID,
    PARTIAL_ID,
    PARAMETER_ID,
    VALUE_ID,
    MAX_ID
};

struct FXNode*      n ;
struct List*        l ;
struct Window*      xappwin ;
struct Gadget*      glist ;
struct Gadget*      gad ;
APTR                vi ;
struct Screen       *ps ;
BOOL                winopen ;

struct MsgPort*    MyPort ;
struct MsgPort*    XAppPort ;
struct MsgPort*    replyPort ;

char                MyPortName[XAPPNAMELENGTH] ;
APTR                xHandle ;


struct TagItem __aligned ti[] = {
    {XAPP_Name,     (ULONG)"BNK-DEMO"},
    {XAPP_PortName, (ULONG)MyPortName},
    {XAPP_Type,     (ULONG)XAPPTYP_BANKEDITOR},
    {TAG_DONE}
};

struct TagItem __aligned th[] = {
    {XAPP_Handle,   NULL},
    {TAG_DONE}
};

struct TagItem __aligned td[] = {
    {XAPP_Handle,           NULL},
    {BANK_MidiBuffer,       NULL},
    {BANK_MidiLength,       0},
    {TAG_DONE}
};

struct TagItem __aligned rd[] = {
    {XAPP_Handle,           NULL},
    {BANK_MidiBuffer,       NULL},
    {BANK_MidiLength,       0},
    {TAG_DONE}
};




struct Partial {
    UBYTE pa_Value[58] ;
};

struct Tone {
    char   to_Name[10] ;
    UBYTE  to_P12 ;
    UBYTE  to_P34 ;
    UBYTE  to_PMute ;
    UBYTE  to_EnvMode ;
    UBYTE  to_Partial[4][58] ;
};

struct bnkDemoData {
    struct SignalSemaphore *bd_Semaphore ;
    WORD                    bd_UnitNumber ;
    WORD                    bd_ToneNumber ;
    WORD                    bd_ProgramNumber ;
    WORD                    bd_PartNumber ;
    WORD                    bd_PartialNumber ;
    WORD                    bd_ParamNumber ;
    struct Tone             bd_Tone[64] ;
} bData ;

char partial[58][22] = {
     "WG PITCH COARSE      ",
     "WG PITCH FINE        ",
     "WG PITCH KEYFOLLOW   ",
     "WG PITCH BENDER SW   ",
     "WG WAVEFORM/PCM BANK ",
     "WG PCM WAVE          ",
     "WG PULSE WIDTH       ",
     "WG PW VELO SENS      ",
     "P-ENV DEPTH          ",
     "P-ENV VELO SENS      ",
     "P-ENV TIME KEYF      ",
     "P-ENV TIME 1         ",
     "P-ENV TIME 2         ",
     "P-ENV TIME 3         ",
     "P-ENV TIME 4         ",
     "P-ENV LEVEL 0        ",
     "P-ENV LEVEL 1        ",
     "P-ENV LEVEL 2        ",
     "P-ENV SUSTAIN LEVEL  ",
     "END LEVEL            ",
     "P-LFO RATE           ",
     "P-LFO DEPTH          ",
     "P-LFO MOD SENS       ",
     "TVF CUTOFF FREQ      ",
     "TVF RESONANCE        ",
     "TVF KEYFOLLOW        ",
     "TVF BIAS POINT/DIR   ",
     "TVF BIAS LEVEL       ",
     "TVF ENV DEPTH        ",
     "TVF ENV VELO SENS    ",
     "TVF ENV DEPTH KEYF   ",
     "TVF ENV TIME KEYF    ",
     "TVF ENV TIME 1       ",
     "TVF ENV TIME 2       ",
     "TVF ENV TIME 3       ",
     "TVF ENV TIME 4       ",
     "TVF ENV TIME 5       ",
     "TVF ENV LEVEL 1      ",
     "TVF ENV LEVEL 2      ",
     "TVF ENV LEVEL 3      ",
     "TVF ENV SUSTAIN LEVEL",
     "TVA LEVEL            ",
     "TVA VELO SENS        ",
     "TVA BIAS POINT 1     ",
     "TVA BIAS LEVEL 1     ",
     "TVA BIAS POINT 2     ",
     "TVA BIAS LEVEL 2     ",
     "TVA ENV TIME KEYF    ",
     "TVA ENV TIME V_FOLLOW",
     "TVA ENV TIME 1       ",
     "TVA ENV TIME 2       ",
     "TVA ENV TIME 3       ",
     "TVA ENV TIME 4       ",
     "TVA ENV TIME 5       ",
     "TVA ENV LEVEL 1      ",
     "TVA ENV LEVEL 2      ",
     "TVA ENV LEVEL 3      ",
     "TVA ENV SUSTAIN LEVEL"
};


WORD minpartial[58] = {
    0, 0, 0, 0, 0, 0, 0, 0,                 // 8
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,     // 12
    0, 0, 0,                                // 3
    0, 0, 0, 0, 0,                          // 5
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 13
    0, 0, 0, 0, 0, 0,                       // 6
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0         // 11
};

WORD maxpartial[58] = {
    96, 100, 16, 1, 3, 127, 100, 14,                                // 8
    10, 100, 4, 100, 100, 100, 100, 100, 100, 100, 0, 100,          // 12
    100, 100, 100,                                                  // 3
    100, 30, 14, 127, 14,                                           // 5
    100, 100, 4, 4, 100, 100, 100, 100, 100, 100, 100, 100, 100,    // 13
    100, 100, 127, 12, 127, 12,                                     // 6
    4, 4, 100, 100, 100, 100, 100, 100, 100, 100, 100               // 11
};

static char     filename[80] ;
static char     fname[80]  = "Untitled.bank" ;
static char     pname[80] = "Euterpe:Banks/Roland/MT32" ;
static char     tonename[11] ;
static UBYTE    midibuffer[512] ;


struct SignalSemaphore *MySemaphore ;

struct Gadget* tabgad[MAX_ID] ;

static ULONG winsig, msig, signal ;
BOOL fin  ;
#define HIGHPRI 21

struct XAppMsg  *xmsg, *replymsg, *emsg ;

extern __stdargs ULONG HookEntry() ;

VOID main(VOID) ;
BOOL InitAll(void) ;
BOOL CloseAll(WORD level) ;
void ProcessEvents(void) ;
BOOL InitWin(void) ;
BOOL CloseWin(WORD level) ;
void ProcessWinEvents(void) ;
VOID StripWindow(struct Window *win) ;
VOID StripIntuiMessages( struct MsgPort *mp, struct Window *win ) ;
VOID StripMessages( struct MsgPort *mp ) ;

void UploadTone(void) ;
void DownLoadTone(void) ;
void LoadTone(void) ;
void SaveTone(void) ;
void SetPart(void) ;
void SetPrg(void) ;
struct FileRequester *InitAslFileReq(struct Screen *s, STRPTR drawer, const char *title) ;
BOOL getfile(struct Screen *s, STRPTR name, STRPTR drawer, STRPTR pat, const char *title, BOOL savemode) ;
void PatchName(void) ;
void GetProgramList(void) ;
