#include "inc.h"
#include "defs.h"
#include "zz_pointer.h"
#include <ctype.h>
#include <devices/printer.h>
#include <hardware/cia.h>

extern int volume;
extern int polymode;
extern int sources;
extern int ams1,ams2;
extern int prsfreq;
extern int vibdepth;
extern int vibpres;
extern int pitchbend;
extern int lfospeed;
extern int lfoshape;
extern int kscurve;
extern int vibwheel;
extern int autodepth;
extern int autotime;
extern int autobendvel;
extern int autobendks;

extern int mute[4];
extern int fine[4];
extern int coarse[4];
extern int wave[4];
extern int keytrack[4];
extern int vibabend[4];
extern int prsonfreq[4];
extern int velcurve[4];
extern int envlevel[4];
extern int envdelay[4];
extern int envattack[4];
extern int envdecay[4];
extern int envsustain[4];
extern int envrelease[4];
extern int levelmodvel[4];
extern int levelmodprs[4];
extern int levelmodks[4];
extern int timemodvel[4];
extern int timemodks[4];
extern int freqksfreq[4];

extern int soundnr[8];
extern int banknr[8];
extern int zonelow[8];
extern int zonehigh[8];
extern int poly[8];
extern int output[8];
extern int mode[8];
extern int rcvch[8];
extern int velo[8];
extern int transpose[8];
extern int tune[8];
extern int level[8];

extern char *ToneName[12];
extern char *ModName[6];
extern char *ShapeName[4];
extern char *ModName[6];
extern char *PolyName[3];
extern char *WaveName[256];

extern struct CIA ciab;
struct MsgPort *port;


void PrintMulti(const int nr);
void PrintSingle(const int nr);

#define RESET		"c"
#define INIT		"#1"
#define NORM		"[0m"

#define IT_ON		"[3m"
#define IT_OFF		"[23m"

#define UL_ON		"[4m"
#define UL_OFF		"[24m"

#define BOLD_ON		"[1m"
#define BOLD_OFF	"[22m"

#define ELITE_ON	"[2w"
#define ELITE_OFF	"[1w"

#define COND_ON		"[4w"
#define COND_OFF	"[3w"

#define PROP_ON		"[2p"
#define PROP_OFF	"[1p"
#define PROP_CLEAR	"[0p"

#define Out(x)		Write(fp,x,strlen(x));


/**********************************************************************************/
/***                                                                            ***/
/**********************************************************************************/

void PrintMulti(const int nr)
{
	char name[10],string[255];
	int i,j,bn,sn;
	BPTR fp;
	SHORT r;


	ZZ_POINTER(win);
	sn=soundnr[i];
	bn=banknr[i];

 	for (i=0;i<=9;i++) name[i]=m[nr][i];
	name[10]='\0';

	fp=Open("prt:",MODE_NEWFILE);

	if (fp == NULL)
	{
		MyReq("Can't print multi-patch",NULL,"Go on");
		CLEAR_POINTER(win);	
		return();
	}

	sprintf(string,UL_ON BOLD_ON"\n\nMulti-Patch: %s\n\n"BOLD_OFF UL_OFF"\n",name);	
	Out(string);

	Out(UL_ON "Name        ZoneL  ZoneH  Channel  Velo  Out  Poly  Mode  Trans  Tune  Level\n" UL_OFF);

	for (i=0;i<=7;i++)
	{   
		for (j=0;j<=9;j++)
		{
			if (isprint(s[banknr[i]>3 ? 1 :0][soundnr[i]+8*(banknr[i]>3 ? banknr[i]-4 : banknr[i])][j]))
				name[j]=s[banknr[i]>3 ? 1 :0][soundnr[i]+8*(banknr[i]>3 ? banknr[i]-4 : banknr[i])][j];
			else  name[j]=' ';
		}
		if (poly[i]==1) goto Ende;
		name[10]='\0';
		sprintf(string,"%10s",name);
		Out(string);

		sprintf(string,"   %2s%2ld",ToneName[zonelow[i]%12],(int)(zonelow[i]/12)-2);
		Out(string);
		sprintf(string,"   %2s%2ld",ToneName[zonelow[i]%12],(int)(zonehigh[i]/12)-2);
		Out(string);

		sprintf(string,"     %2ld",rcvch[i]+1);
		Out(string);

		if(velo[i]==0) strcpy(string,"    All ");
		if(velo[i]==1) strcpy(string,"    Soft");
		if(velo[i]==2) strcpy(string,"    Loud");
		Out(string); 

		if(output[i]==0) strcpy(string,"   R ");
		if(output[i]==1) strcpy(string,"  R+L");
		if(output[i]==2) strcpy(string,"   L ");
		if(output[i]==3) strcpy(string,"  BYP");
		Out(string);		

		if(poly[i]==0) strcpy(string,"   VR");
				  else sprintf(string,"   %ld ",poly[i]-1);
		Out(string);		

		if(mode[i]==0) strcpy(string,"   KEYB");
		if(mode[i]==1) strcpy(string,"   MIDI");
		if(mode[i]==2) strcpy(string,"   MIX ");
		Out(string);		

		sprintf(string,"   %3ld ",transpose[i]-24);
		Out(string);		

		sprintf(string,"   %3ld ",tune[i]-50);
		Out(string);		

		sprintf(string,"  %3ld ",level[i]);
		Out(string);		
	
		Out("\n");	
		Ende: ;
	} 

	Out(COND_ON "\nOutput by K1-II Librarian V "VERSION", (C) in 1990-93 by Andreas Jung\n\n" COND_OFF);

MultiEnde: ;
	Close(fp);
	CLEAR_POINTER(win);	
	return();
}

/**********************************************************************************/
/***                                                                            ***/
/**********************************************************************************/

void PrintSingle(const int nr)
{
	BPTR fp;
	char name[10],string[255];
	int i,j,bn,sn;
	SHORT r;

	ZZ_POINTER(win);
	sn=soundnr[i];
	bn=banknr[i];

	for (i=0;i<=9;i++) name[i]=s[nr/32][nr%32][i];
	name[10]='\0';

	fp=Open("prt:",MODE_NEWFILE);

	if (fp == NULL)
	{
		MyReq("Can't print single-patch",NULL,"Go on");
		CLEAR_POINTER(win);	
		return();
	}

	sprintf(string,UL_ON BOLD_ON"Single-Patch: %s\n"BOLD_OFF UL_OFF"\n",name);
 	Out(string);

	sprintf(string,"Volume: %3d\n\n",volume);
	Out(string);

	Out("Vibrato-LFO\t\tAuto-Bend\n");

	sprintf(string,"Shape    : %s \t\tDepth   : %3d\n",ShapeName[lfoshape],autodepth-50);
	Out(string);

	sprintf(string,"Speed    : %3d\t\tTime    : %3d\n",lfospeed,autotime);
	Out(string);

	sprintf(string,"Depth    : %3d\t\tVel>Dep : %3d\n",vibdepth-50,autobendvel-50);
	Out(string);

	sprintf(string,"Prs>Depth: %3d\t\tKS>Time : %3d\n",vibpres-50,autobendks-50);
	Out(string);

	sprintf(string,"Vib wheel: %s   \tKS-Curve: %3d\n\n",vibwheel=0 ? "Depth" : "Speed",kscurve+1 );
	Out(string);

	sprintf(string,"Pitchbend: %3d\t\tS1.S2   : %s\t\tPolymode: %s\n",pitchbend,ModName[ams1],PolyName[polymode]);
	Out(string);

	sprintf(string,"Prs>Freq : %3d\t\tS3.S4   : %s\t\tSources : %d\n\n",prsfreq-50,ModName[ams2+3],2*(sources+1));
	Out(string);

	Out("Oscillators\t #1\t\t #2");
	if(sources != 0) Out("\t\t #3\t\t #4\n");
	if(sources == 0) Out("\n");

	Out("Coarse:\t");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			if (keytrack[i]==1)
			{
				sprintf(string,"\t%3d\t",coarse[i]-84);
				Out(string);
			}
			else
			{	
				sprintf(string,"\t%2s%2ld\t",ToneName[coarse[i]%12],(coarse[i]/12)-4);
				Out(string);
			}
		}
		Out("\n");

	Out("Fine:\t");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",fine[i]-50);
			Out(string);
		}
		Out("\n");

	Out("Key on track:");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%s\t",keytrack[i]==1 ? " On" : "Off");
			Out(string);
		}
		Out("\n");

	Out("Vibrato\t");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%s\t",vibabend[i]==1 ? " On" : "Off");
			Out(string);
		}
		Out("\n");

	Out("Prs on freq:");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%s\t",prsonfreq[i]==1 ? " On" : "Off");
			Out(string);
		}
		Out("\n");

	Out("KS>Freq: ");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",freqksfreq[i]-50);
			Out(string);
		}
		Out("\n");

	Out("\n");			/* Nächster Datenblock */


	Out("Level:\t");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",envlevel[i]);
			Out(string);
		}
		Out("\n");

	Out("Delay:\t");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",envdelay[i]);
			Out(string);
		}
		Out("\n");
 	
	Out("Attack:\t");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",envattack[i]);
			Out(string);
		}
		Out("\n");

	Out("Decay:\t");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",envdecay[i]);
			Out(string);
		}
		Out("\n");

	Out("Sustain:");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",envsustain[i]);
			Out(string);
		}
		Out("\n");
 	
	Out("Release:");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",envrelease[i]);
			Out(string);
		}
		Out("\n");

 	Out("Vel-Curve:");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",velcurve[i]+1);
			Out(string);
		}
		Out("\n");

	Out("Level>Vel: ");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",levelmodvel[i]-50);
			Out(string);
		}
		Out("\n");
 	
	Out("Level>Prs: ");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",levelmodprs[i]-50);
			Out(string);
		}
		Out("\n");
 	
	Out("Level>KS: ");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",levelmodks[i]-50);
			Out(string);
		}
		Out("\n");
 	
	Out("Time>Vel: ");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",timemodvel[i]-50);
			Out(string);
		}
		Out("\n");
 	
	Out("Time>KS: ");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",timemodks[i]-50);
			Out(string);
		}
		Out("\n");

	Out("\n");			/* Nächster Datenblock */


	Out("Mute:\t");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%s\t",mute[i]==1 ? "Off" : " On");
			Out(string);
		}
		Out("\n");

	Out("Waveform:");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%3d\t",wave[i]+1);
			Out(string);
		}
		Out("\n");
		for (i=0;i<=2*(sources+1)-1;i++) 
		{
			sprintf(string,"\t%15s",WaveName[wave[i]]);
			Out(string);
		}
		Out("\n");

		Out(COND_ON "\nOutput by K1-II Librarian V "VERSION", (C) in 1990-93 by Andreas Jung\n\n" COND_OFF);
 	

SingleEnde: ;
	Close(fp);
	CLEAR_POINTER(win);
	return();
}

