/*
 * GLIB - a Generic LIBrarian and editor for synths
 *
 * TX81Z routines for Patch parameters
 */

#define OVERLAY1

#include "glib.h"
#include <ctype.h>

char *visnum(), *visonoff(), *vism3num(), *viswave(), *vismono();
char *visdx1a(), *vistxwave(), *vistxsft();
char *vistxf1(), *vistxf2(), *vistxf3(), *vistxf4();
char *visfx(), *visfix1(), *visfix2(), *visfix3(), *visfix4();
extern int Dopmap[];

/* This array contains arbitrary screen labels */
struct labelinfo Ltx81z[] = {
5,0," O       Dcy Lev Dcy               De  Out     Amp Eg  Key Key EG",
6,0," P   Atk  1   1   2  Rls Wav  Freq tun Lvl Vel Mod Bia Rat Scl Sft Fix/Ratio",
7,0," -   --- --- --- --- --- --- ----- --- --- --- --- --- --- --- --- ---------",
8,0," 1",
9,0," 2",
10,0," 3",
11,0," 4",
17,0,"-------------------------+",
18,0,"N = set name  q = quit   |",
19,0,"K = incr      J = decr   |",
20,0,"space = play auto-note   |",
21,0,"                         |",
22,0,"Auto-Note:               |",
23,0,"                         |",
-1,-1,NULL
};

/* This array defines all the editable parameters. */
struct paraminfo Ptx81z[] = {
"autopitch",    "Pitch",22, 11, 22, 17, visnum, 0, 127, 60, 0,
"autovol",      "Vol",  23, 0, 23, 4, visnum, 0, 127, 63, 0,
"autodur",      "Dur",  23, 8, 23, 12, visnum, 1, 20, 5, 0,
"autochan",     "Chan", 23, 16, 23, 21, visnum, 1, 16, 1, 0,

"op1attack",    NULL, -1, -1, 8, 6, visnum, 0, 31, 0, 0,
"op1decay1",    NULL, -1, -1, 8, 10, visnum, 0, 31, 0, 0,
"op1level1",    NULL, -1, -1, 8, 14, visnum, 0, 15, 0, 0,
"op1decay2",    NULL, -1, -1, 8, 18, visnum, 0, 31, 0, 0,
"op1release",   NULL, -1, -1, 8, 22, visnum, 0, 31, 0, 0,
"op1wave",      NULL, -1, -1, 8, 26, vistxwave, 0, 7, 0, 0,
"op1freq",      NULL, -1, -1, 8, 30, vistxf1, 0, 878, 0, 0,
"op1detune",    NULL, -1, -1, 8, 36, vism3num, 0, 6, 0, 0,
"op1outlevel",  NULL, -1, -1, 8, 40, visnum, 0, 99, 0, 0,
"op1velocity",  NULL, -1, -1, 8, 44, visnum, 0, 7, 0, 0,
"op1ampmod",    NULL, -1, -1, 8, 47, visonoff, 0, 1, 0, 0,
"op1egbias",    NULL, -1, -1, 8, 52, visnum, 0, 7, 0, 0,
"op1keyrate",   NULL, -1, -1, 8, 56, visnum, 0, 3, 0, 0,
"op1keyscale",  NULL, -1, -1, 8, 60, visnum, 0, 99, 0, 0,
"op1egsft",     NULL, -1, -1, 8, 63, vistxsft, 0, 3, 0, 0,
"op1fix",       NULL, -1, -1, 8, 69, visfix1, 0, 1, 0, 0,
"op2attack",    NULL, -1, -1, 9, 6, visnum, 0, 31, 0, 0,
"op2decay1",    NULL, -1, -1, 9, 10, visnum, 0, 31, 0, 0,
"op2level1",    NULL, -1, -1, 9, 14, visnum, 0, 15, 0, 0,
"op2decay2",    NULL, -1, -1, 9, 18, visnum, 0, 31, 0, 0,
"op2release",   NULL, -1, -1, 9, 22, visnum, 0, 31, 0, 0,
"op2wave",      NULL, -1, -1, 9, 26, vistxwave, 0, 7, 0, 0,
"op2freq",      NULL, -1, -1, 9, 30, vistxf2, 0, 878, 0, 0,
"op2detune",    NULL, -1, -1, 9, 36, vism3num, 0, 6, 0, 0,
"op2outlevel",  NULL, -1, -1, 9, 40, visnum, 0, 99, 0, 0,
"op2velocity",  NULL, -1, -1, 9, 44, visnum, 0, 7, 0, 0,
"op2ampmod",    NULL, -1, -1, 9, 47, visonoff, 0, 1, 0, 0,
"op2egbias",    NULL, -1, -1, 9, 52, visnum, 0, 7, 0, 0,
"op2keyrate",   NULL, -1, -1, 9, 56, visnum, 0, 3, 0, 0,
"op2keyscale",  NULL, -1, -1, 9, 60, visnum, 0, 99, 0, 0,
"op2egsft",     NULL, -1, -1, 9, 63, vistxsft, 0, 3, 0, 0,
"op2fix",       NULL, -1, -1, 9, 69, visfix2, 0, 1, 0, 0,
"op3attack",    NULL, -1, -1, 10, 6, visnum, 0, 31, 0, 0,
"op3decay1",    NULL, -1, -1, 10, 10, visnum, 0, 31, 0, 0,
"op3level1",    NULL, -1, -1, 10, 14, visnum, 0, 15, 0, 0,
"op3decay2",    NULL, -1, -1, 10, 18, visnum, 0, 31, 0, 0,
"op3release",   NULL, -1, -1, 10, 22, visnum, 0, 31, 0, 0,
"op3wave",      NULL, -1, -1, 10, 26, vistxwave, 0, 7, 0, 0,
"op3freq",      NULL, -1, -1, 10, 30, vistxf3, 0, 878, 0, 0,
"op3detune",    NULL, -1, -1, 10, 36, vism3num, 0, 6, 0, 0,
"op3outlevel",  NULL, -1, -1, 10, 40, visnum, 0, 99, 0, 0,
"op3velocity",  NULL, -1, -1, 10, 44, visnum, 0, 7, 0, 0,
"op3ampmod",    NULL, -1, -1, 10, 47, visonoff, 0, 1, 0, 0,
"op3egbias",    NULL, -1, -1, 10, 52, visnum, 0, 7, 0, 0,
"op3keyrate",   NULL, -1, -1, 10, 56, visnum, 0, 3, 0, 0,
"op3keyscale",  NULL, -1, -1, 10, 60, visnum, 0, 99, 0, 0,
"op3egsft",     NULL, -1, -1, 10, 63, vistxsft, 0, 3, 0, 0,
"op3fix",       NULL, -1, -1, 10, 69, visfix3, 0, 1, 0, 0,
"op4attack",    NULL, -1, -1, 11, 6, visnum, 0, 31, 0, 0,
"op4decay1",    NULL, -1, -1, 11, 10, visnum, 0, 31, 0, 0,
"op4level1",    NULL, -1, -1, 11, 14, visnum, 0, 15, 0, 0,
"op4decay2",    NULL, -1, -1, 11, 18, visnum, 0, 31, 0, 0,
"op4release",   NULL, -1, -1, 11, 22, visnum, 0, 31, 0, 0,
"op4wave",      NULL, -1, -1, 11, 26, vistxwave, 0, 7, 0, 0,
"op4freq",      NULL, -1, -1, 11, 30, vistxf4, 0, 878, 0, 0,
"op4detune",    NULL, -1, -1, 11, 36, vism3num, 0, 6, 0, 0,
"op4outlevel",  NULL, -1, -1, 11, 40, visnum, 0, 99, 0, 0,
"op4velocity",  NULL, -1, -1, 11, 44, visnum, 0, 7, 0, 0,
"op4ampmod",    NULL, -1, -1, 11, 47, visonoff, 0, 1, 0, 0,
"op4egbias",    NULL, -1, -1, 11, 52, visnum, 0, 7, 0, 0,
"op4keyrate",   NULL, -1, -1, 11, 56, visnum, 0, 3, 0, 0,
"op4keyscale",  NULL, -1, -1, 11, 60, visnum, 0, 99, 0, 0,
"op4egsft",     NULL, -1, -1, 11, 63, vistxsft, 0, 3, 0, 0,
"op4fix",       NULL, -1, -1, 11, 69, visfix4, 0, 1, 0, 0,

"algorithm",    "Algorithm~l~l~l~l~l~l~l~l~l~d=============",   1, 49, 1, 61, visdx1a, 0, 7, 0, 0,

"feedback",     "Feedback",     13, 33, 13, 45, visnum, 0, 7, 0, 0,
"transpose",    "Transpose",    14, 33, 14, 45, visnum, 0, 45, 0, 0,
"lfospeed",     "LFO Speed",    15, 33, 15, 45, visnum, 0, 99, 0, 0,
"lfodelay",     "LFO Delay",    16, 33, 16, 45, visnum, 0, 99, 0, 0,
"lfowave",      "LFO Wave",     17, 33, 17, 45, viswave, 0, 3, 0, 0,
"lfosync",      "LFO Sync",     18, 33, 18, 45, visonoff, 0, 1, 0, 0,
"pitchbend",    "Pitch Bend",   19, 33, 19, 45, visnum, 0, 12, 0, 0,
"portatime",    "Port. Time",   20, 33, 20, 45, visnum, 0, 99, 0, 0,
"portmode",     "Port. Mode",   21, 33, 21, 45, visnum, 0, 1, 0, 0,
"portfoot",     "Port. Foot",   22, 33, 22, 45, visonoff, 0, 1, 0, 0,
"susfoot",      "Sus. Foot",    23, 33, 23, 45, visonoff, 0, 1, 0, 0,
"playmode",     "Mono/Poly",            13, 55, 13, 74, vismono, 0, 1, 0, 0,
"amoddepth",    "Amp Mod Depth",        14, 55, 14, 74, visnum, 0, 99, 0, 0,
"amodsens",     "Amp Mod Sense",        15, 55, 15, 74, visnum, 0, 3, 0, 0,
"pmoddepth",    "Pitch Mod Depth",      16, 55, 16, 74, visnum, 0, 99, 0, 0,
"pmodsens",     "Pitch Mod Sense",      17, 55, 17, 74, visnum, 0, 7, 0, 0,
"modprange",    "Mod Pitch Range",      18, 55, 18, 74, visnum, 0, 99, 0, 0,
"modarange",    "Mod Amp Range",        19, 55, 19, 74, visnum, 0, 99, 0, 0,
"breathprange", "Breath Pitch",         20, 55, 20, 74, visnum, 0, 99, 0, 0,
"breatharange", "Breath Amp",           21, 55, 21, 74, visnum, 0, 99, 0, 0,
"breathpbias",  "Breath Pitch Bias",    22, 55, 22, 74, visnum, 0, 99, 0, 0,
"breathegbias", "Breath EG Bias",       23, 55, 23, 74, visnum, 0, 99, 0, 0,

"reverbrate",   "Reverb Rate",          13, 11, 13, 24, visnum, 0, 7, 0, 0,
"fcpitch",      "FC Pitch",             14, 11, 14, 24, visnum, 0, 99, 0, 0,
"fcamp",        "FC Amp",               15, 11, 15, 24, visnum, 0, 99, 0, 0,
NULL,   NULL, -1, -1, -1, -1, visnum, 0, 0, 0, 0
};

extern int *txindex;
extern int txleng;

char *
vistxwave(v)
{
        static char txbuff[3] = "W ";
        txbuff[1] = v + '1';
        return(txbuff);
}

char *visfix1(v) { return(visfx(1,v)); }
char *visfix2(v) { return(visfx(2,v)); }
char *visfix3(v) { return(visfx(3,v)); }
char *visfix4(v) { return(visfx(4,v)); }

char *visfx(n,v)
{
        static int lastfx[] = { 0, -1, -1, -1, -1 };
        char buff2[8];
        int fqindex;

        if ( lastfx[n] != -1 && lastfx[n] == v )
                goto nochange;

        lastfx[n] = v;
        sprintf(buff2,"op%dfreq",n);
        fqindex = parmindex(buff2);
        if ( v == 0 )
                P[fqindex].p_max = txleng-1;
        else
                P[fqindex].p_max = 247;
        if ( P[fqindex].p_val > P[fqindex].p_max )
                P[fqindex].p_val = P[fqindex].p_max;
        showparam(fqindex,0);
nochange:
        if ( v == 0 )
                return("ratio");
        else
                return("fixed");
}

char *
vistxsft(v)
{
        switch(v){
        case 0: return("off");
        case 1: return("48");
        case 2: return("24");
        case 3: return("12");
        }
        return("??");
}

extern int txfreq[];

char *
vistxq(v)
{
        static char fbuff[8];
        int f, n1, n2;

        txinit();
        f = txfreq[txindex[v]];
        n1 = f/100;
        n2 = f%100;
        sprintf(fbuff,n2<10?"%d.0%d":"%d.%d",n1,n2);
        return(fbuff);
}

char *
visfq(v)
{
        static char fixbuff[8];

        sprintf(fixbuff,"%-5d",v+8);
        return(fixbuff);
}

char *
visnfix(n,v)
{
        char buff[8];
        int fx;

        sprintf(buff,"op%dfix",n);
        fx = getval(buff);
        if ( fx == 0 )
                return(vistxq(v));
        else
                return(visfq(v));
}

char *vistxf1(v) { return(visnfix(1,v)); }
char *vistxf2(v) { return(visnfix(2,v)); }
char *vistxf3(v) { return(visnfix(3,v)); }
char *vistxf4(v) { return(visnfix(4,v)); }
