/*
 * 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)); }
