
// OLD FILE !! DO NOT INCLUDE //

void led_num(unsigned char num){//LIT LED
	MIOS_DOUT_SRSet(1,led_pos[num][0]);
	MIOS_DOUT_SRSet(2,led_pos[num][1]);
	return;
}

/////////////////////////////////////////////////////////////////////////////
// DISPLAY MIDI CHAN
/////////////////////////////////////////////////////////////////////////////
void MIDICHN(unsigned char chn)// SET & DISPLAY GLOBAL MIDI CHAN
{
	midi_channel=chn;
	MIOS_LCD_CursorSet(0xC0);	
	MIOS_LCD_PrintCString("MIDI CHN [");
	MIOS_LCD_PrintBCD2(midi_channel+1);
	MIOS_LCD_PrintCString("] PRG");
	MIOS_LCD_PrintBCD3(prg[midi_channel]);
	led_num(midi_channel);
	return ; 
}



void def(void){//Display default status
	// clear LCD
	/*
(.___/)
(=^.^=) HARD
(")-(") TRACKER	*/

	RECORD=0;//	STEP REC
	EDIT=0;//	EDIT PATTERNS
	PRG=0;//	INPUT PRG

	CTRL=0;
	SPACE=0;
	COMMODORE=0;


	MIOS_LCD_Clear();
	//MIOS_LCD_CursorSet(0x00);	MIOS_LCD_PrintCString("(.___/) HARD");
	//MIOS_LCD_CursorSet(0x40);	MIOS_LCD_PrintCString("(=^.^=) TRACKER");

	MIOS_LCD_CursorSet(0x00);	MIOS_LCD_PrintCString("(.___/)");
	MIOS_LCD_CursorSet(0x40);	MIOS_LCD_PrintCString("(=^.^=)");

	//MIOS_LCD_CursorSet(0x80);	MIOS_LCD_PrintCString("(\")-(\") ");
	MIOS_LCD_CursorSet(0xC0);
	MIOS_LCD_PrintCString("CHN");
	MIOS_LCD_PrintBCD2(midi_channel+1);
	MIOS_LCD_PrintCString(" PRG");
	MIOS_LCD_PrintBCD3(prg[midi_channel]);
	MIOS_LCD_PrintCString(" POS");
	MIOS_LCD_PrintBCD2(song_pos);
	
	led_num(midi_channel);
	return;
}






/////////////////////////////////////////////////////////////////////////////
// Enable/disable Merger
/////////////////////////////////////////////////////////////////////////////
/*
void MERGER(){//Enable/disable Merger
	//st=;
	MIOS_LCD_CursorSet(0x00);

	switch(MIOS_MIDI_MergerGet()){
		case 0x00://MIOS_MIDI_MERGER_DISABLED
			MIOS_MIDI_MergerSet(0x01);//ENABLE MERGER
			MIOS_LCD_PrintCString("MIDI MERGER DISABLED");		break;
		case 0x01://MIOS_MIDI_MERGER_ENABLED
			MIOS_MIDI_MergerSet(0x00);//DISABLE MERGER
			MIOS_LCD_PrintCString("MIDI MERGER ENABLED");		break;
		case 0x02://MIDIbox Link End Point
			MIOS_LCD_PrintCString("MB Link End Point");			break;
		case 0x03://MIDIbox Link Forwarding Point
			MIOS_LCD_PrintCString("MB Link Fwd Point");			break;
		default: 
			MIOS_LCD_PrintCString("ERROR");			break;
	}
}
*/

/////////////////////////////////////////////////////////////////////////////
// DISPLAY LITTERAL NOTES
/////////////////////////////////////////////////////////////////////////////
void GET_NCHR(unsigned char note){// DISPLAY LITTERAL NOTES !!!

	unsigned char n=0;	// 8bit is enough
	unsigned char oct=0;// octave number

	if(note==0x80){
		MIOS_LCD_CursorSet(0x51);
		MIOS_LCD_PrintCString("NUL");//
		return;
	}

	if(note==0x81){
		MIOS_LCD_CursorSet(0x51);
		MIOS_LCD_PrintCString("PAD");//
		return;
	}

	do{
		oct++;
		n=oct*12;
	}

	while(n<=note);
	oct--;
	//nn=note-12*oct;//Note number

	MIOS_LCD_CursorSet(0x51);
	MIOS_LCD_PrintCString(note_name[note-12*oct]);//
	MIOS_LCD_PrintBCD1(oct);
	return ; 
}




/////////////////////////////////////////////////////////////////////////////
// INIT PATTERN
/////////////////////////////////////////////////////////////////////////////
/*
void INITPAT(){//CLEAR PATTERN
	unsigned char i;
	unsigned char j;
	for(i=0;i<16;i++){
		for(j=0;j<16;j++){
			pattern[i][j][0]=0x80;
			//pattern[i][j]=0x80;
		}
	}
}
*/




/////////////////////////////////////////////////////////////////////////////
// "INKEY" KEYBOARD INPUT (STR)
/////////////////////////////////////////////////////////////////////////////

unsigned char instep=0;//input step count

//KEY VALUES
//  1 : 56
//  2 : 60
//  3 : 48
//  4 : 52
//  5 : 40
//  6 : 44
//  7 : 32
//  8 : 36
//  9 : 24
//  0 : 28

void PRG_IN(void)// READ KEYBOARD INPUTS (And store string to buffer str_buffer)
{
	unsigned char i;
	unsigned char chr;
	//unsigned char prgnum;
	// 0 -> del
	// 1 -> return
	// 57 -> echap
	if(PRG==0){
		PRG=1;
		CTRL=0;
		instep=0;
		MIOS_LCD_Clear();
		for(i=0;i<3;i++)int_buffer[i]=0;//Clear buffer
		return;
	}

	MIOS_LCD_CursorSet(0x00);
	MIOS_LCD_PrintCString("PRG ");//

	MIOS_LCD_CursorSet(0x40);
	MIOS_LCD_PrintCString("CHN");//
	MIOS_LCD_PrintBCD2(midi_channel+1);
	MIOS_LCD_PrintCString(" Current :");//
	MIOS_LCD_PrintBCD3(prg[midi_channel]);


	switch (last_mx_pin) {

		case 0://del
			int_buffer[instep]=0x00;
			MIOS_LCD_CursorSet(0x04 + instep);
			MIOS_LCD_PrintChar(' ');//SPACE (clr)
			if(instep>0)instep--;
			return;break;

		case 1://return;
			
			if(instep==1)i=int_buffer[0];
			if(instep==2)i=int_buffer[0]*10+int_buffer[1];
			if(instep==3)i=int_buffer[0]*100+int_buffer[1]*10+int_buffer[2];

			PRG_CHNG(i);

			PRG=0;//Libčre le clavier

			return;break;
		
		case 57://esc
			MIOS_LCD_Clear();
			MIOS_LCD_CursorSet(0x00);
			MIOS_LCD_PrintCString("CANCEL");//
			PRG=0;
			return;break;

		// CONVERT DIGITS ONLY !!
		case 56:chr=1;break;
		case 60:chr=2;break;
		case 48:chr=3;break;
		case 52:chr=4;break;
		case 40:chr=5;break;
		case 44:chr=6;break;
		case 32:chr=7;break;
		case 36:chr=8;break;
		case 24:chr=9;break;
		case 28:chr=0;break;

		default:
			return;
			break;
	}

	//STORE VALUE
	MIOS_LCD_CursorSet(0x04 + instep);
	int_buffer[instep]=chr;
	//MIOS_LCD_PrintChar(note_map[_chr][1]);//ASCII CHR
	MIOS_LCD_PrintBCD1(chr);//ASCII CHR
	if(instep<2)instep++;


	MIOS_LCD_CursorSet(0x40);
	MIOS_LCD_PrintBCD1(instep);

	return;
}

/*
void INKEY(unsigned char _chr)// READ KEYBOARD INPUTS (And store string to buffer str_buffer)
{
	// 0 -> del
	// 1 -> return
	// 57 -> echap

	unsigned char i=0;	// 8bit is enough

	if(INPUT==0){
		MIOS_LCD_Clear();
		mode=2;//Ne joue pas les notes
		INPUT=1;
		instep=0;

		for(i=0;i<16;i++){
			str_buffer[i]=0x00;
		}
		
		return;
	}

	MIOS_LCD_CursorSet(0x00);
	MIOS_LCD_PrintCString("INPUT ");//
	MIOS_LCD_PrintBCD2(instep+1);

	switch (_chr) {

		case 0://del
			if(instep>0){
				instep--;
				str_buffer[instep]=0x00;
				MIOS_LCD_CursorSet(64 + instep);
				MIOS_LCD_PrintChar(note_map[63][1]);//SPACE (clr)
			}
			break;

		case 1://return;
			MIOS_LCD_PrintCString("OK     ");//
			INPUT=0;
			break;
		
		case 57://esc
			INPUT=0;
			break;

		default:
			
			//MIOS_LCD_CursorSet(0x40 + instep);
			MIOS_LCD_CursorSet(64 + instep);

			//chr=note_map[pin][1];
			str_buffer[instep]=_chr;
			MIOS_LCD_PrintChar(note_map[_chr][1]);//ASCII CHR
			if(instep<16)instep++;
			break;

	}

	return ; 
}
*/


/////////////////////////////////////////////////////////////////////////////
// ALL_NOTE_OFF
/////////////////////////////////////////////////////////////////////////////
void ALL_NOTE_OFF(){//KILL EVERY NOTES 
	//MIOS_MIDI_TxBufferPut(0xB0);//Controller Chn 1
	unsigned char i=0;
	for(i=0;i<15;i++){
		MIOS_MIDI_TxBufferPut(176 + i);//Controller Chn i
		MIOS_MIDI_TxBufferPut(123);//ALL NOTE OFF // http://www.borg.com/~jglatt/tech/midispec/ctllist.htm
		MIOS_MIDI_TxBufferPut(0x00);
	}
	return;
}
/////////////////////////////////////////////////////////////////////////////
// STOP SEQUENCER
/////////////////////////////////////////////////////////////////////////////
void STOP(void){
	RUNSTOP=0;
	MCLOCK_DoStop();
	step=0;//sequencer step
	_tik=0;
	song_pos=0;
	ALL_NOTE_OFF();
	led_num(midi_channel);
	return;
}
/////////////////////////////////////////////////////////////////////////////
// RUN-STOP SEQUENCER (KEY : SPACE+RUNSTOP)
/////////////////////////////////////////////////////////////////////////////
void RUN(){
	MIOS_LCD_CursorSet(0x80);
	if(RUNSTOP==0){
		RUNSTOP=1;
		MIOS_LCD_PrintCString("RUN      ");
		MCLOCK_DoPlay();
	}else{
		RUNSTOP=0;
		MIOS_LCD_PrintCString("STOP     ");
		STOP();
	}
}







/////////////////////////////////////////////////////////////////////////////
// Send BANK change
/////////////////////////////////////////////////////////////////////////////
/*
void BNK_CHNG(unsigned char bank){//CHANGE BANK !!
	MIOS_LCD_CursorSet(0x8e);
	MIOS_LCD_PrintCString("BNK");//
	MIOS_LCD_PrintBCD3(bank);

	MIOS_MIDI_TxBufferPut(176 + midi_channel);//Controller Chn 1
	MIOS_MIDI_TxBufferPut(0x00);//coarse // http://www.borg.com/~jglatt/tech/midispec/ctllist.htm
	MIOS_MIDI_TxBufferPut(bank);
	return;
}
*/



/////////////////////////////////////////////////////////////////////////////
// GLOBAL TRANSPOSE (play mode)
/////////////////////////////////////////////////////////////////////////////
void TRANSPOSE(unsigned char transp){
	transpose=transp;
	MIOS_LCD_CursorSet(0x51);
	MIOS_LCD_PrintCString("+");
	MIOS_LCD_PrintBCD2(transpose);
	return;
}



/////////////////////////////////////////////////////////////////////////////
// RANDOM GENERATOR
/////////////////////////////////////////////////////////////////////////////
unsigned char random_seed_l;
unsigned char random_seed_h;

void gen_random_number(void)
{
  unsigned int tmp = random_seed_l * random_seed_h;
  random_seed_l = TMR0L + (unsigned char)(tmp & 0xff);
  random_seed_h = 0x69 + (unsigned char)(tmp >> 8);
	MIOS_LCD_PrintCString("RND:");
	MIOS_LCD_PrintBCD3(tmp);
}









unsigned char recstep=0;//STEP RECORD



//INIT 16 STEP PATTERN LAYOUT
void sprintrec(){

	// Display pos with leds //
	led_num(recstep);

	MIOS_LCD_Clear();
	MIOS_LCD_CursorSet(0x00);//ORIGIN
	MIOS_LCD_PrintChar(0x00);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x00);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x00);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x00);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x01);
	MIOS_LCD_PrintChar(0x01);	

	MIOS_LCD_PrintCString(" LY");//
	MIOS_LCD_PrintBCD1(layer);//

	MIOS_LCD_CursorSet(recstep);
	MIOS_LCD_PrintChar(0x02);//pointer

	MIOS_LCD_CursorSet(0x91);
//	MIOS_LCD_PrintCString("P");
//	MIOS_LCD_PrintHex2(phrase);


	// NOTE PREVIEW
	MIOS_LCD_CursorSet(0xC0);
	MIOS_LCD_PrintHex2(main[recstep]);//note Layer 0
	MIOS_LCD_PrintChar(' ');
	MIOS_LCD_PrintHex2(main[recstep+16]);//note Layer 1
	MIOS_LCD_PrintChar(' ');
	MIOS_LCD_PrintHex2(main[recstep+32]);//note Layer 2
	MIOS_LCD_PrintChar(' ');
	MIOS_LCD_PrintHex2(main[recstep+48]);//note Layer 3

	return;
}

void note_off(void){//editor
	// ALL NOTES OFF
	 MIOS_MIDI_TxBufferPut(176 + midi_channel);//Controller Chn i
	 MIOS_MIDI_TxBufferPut(123);//ALL NOTE OFF // http://www.borg.com/~jglatt/tech/midispec/ctllist.htm
	 MIOS_MIDI_TxBufferPut(0x00);
	 return;
}

void note_on(){//play note (editor)
	note_off();
	if(main[recstep]==0x80)return;
	MIOS_MIDI_TxBufferPut(144 + midi_channel);
	MIOS_MIDI_TxBufferPut(main[recstep]);
	MIOS_MIDI_TxBufferPut(0x7f);//MAX VELOCITY

	if(main[recstep+16]==0x80)return;
	MIOS_MIDI_TxBufferPut(144 + midi_channel);
	MIOS_MIDI_TxBufferPut(main[recstep+16]);
	MIOS_MIDI_TxBufferPut(0x7f);//MAX VELOCITY

	if(main[recstep+32]==0x80)return;
	MIOS_MIDI_TxBufferPut(144 + midi_channel);
	MIOS_MIDI_TxBufferPut(main[recstep+32]);
	MIOS_MIDI_TxBufferPut(0x7f);//MAX VELOCITY

	return;
}
////////////////////////////////////////////////
// 16 STEP PATTERN EDITOR, STEP MODE
////////////////////////////////////////////////
void REC()// RECORD PATTERN, STEP MODE
{
	unsigned char i=0;	// 8bit is enough

	if(RECORD==0){
		INPUT=0;
		RECORD=1;
		recstep=0;
		sprintrec();
		return;
	}

	switch(last_mx_pin){

		case 0://DEL
			main[recstep+(16*layer)]=0x80;//NULL NOTE
			sprintrec();
			break;

		case 1:// RETURN (PAD)
			//pattern[midi_channel][recstep][0]=0x81;//set PAD
			main[recstep+(16*layer)]=0x81;//set PAD
			break;
		
		case 2://NEXT STEP
			recstep++;
			if(recstep>15)recstep=0;
			sprintrec();
			note_on();
			return;break;
		
		case 3:// PREV STEP
			if(recstep==0)recstep=16;
			recstep--;
			sprintrec();
			note_on();
			return;break;

		case 7:
			layer=0;
			sprintrec();
			return;break;
		
		case 6:
			layer=1;
			sprintrec();
			return;break;
		
		case 5:
			layer=2;
			sprintrec();
			return;break;

		case 4:
			layer=3;
			sprintrec();
			return;break;

		case 15:// CLR/HOME -> clear pattern
			for(i=0;i<16;i++)main[i+(16*layer)]=0x80;//NULL NOTE
			sprintrec();
			return;break;
		
		case 57:// ESCAPE
			note_off();
			def();
			return;break;

		case 59:// RUN/STOP
			break;

		case 60:// SPACEBAR
			return;
			break;
	}


	if(note_map[last_mx_pin][0]==0x80){
		return;// not a note !
	}else{
		//REC
		main[recstep+(16*layer)]=note_map[last_mx_pin][0]+transpose;
	}

	recstep++;
	if(recstep>=16)recstep=0;
	sprintrec();
	return ; 
}





unsigned char editstep=0;

void EDIT_DRAW(void){// DRAW EDITOR

	//MIOS_LCD_Clear();//


	// ROW 1 ////// 
	MIOS_LCD_CursorSet(0x00);
	MIOS_LCD_PrintCString(" [");
	MIOS_LCD_PrintHex2(phrase[0]);
	MIOS_LCD_PrintCString("] +");
	MIOS_LCD_PrintHex2(phrase[4]);

	MIOS_LCD_PrintCString(" PHRASE 00");
	MIOS_LCD_PrintCString(" A");

	// ROW 2 ////// 
	MIOS_LCD_CursorSet(0x40);
	MIOS_LCD_PrintCString(" [");
	MIOS_LCD_PrintHex2(phrase[1]);
	MIOS_LCD_PrintCString("] +");
	MIOS_LCD_PrintHex2(phrase[5]);

	MIOS_LCD_PrintCString(" VOICE");
	MIOS_LCD_PrintCString(" A");

	// ROW 3 ////// 
	MIOS_LCD_CursorSet(0x80);
	MIOS_LCD_PrintCString(" [");
	MIOS_LCD_PrintHex2(phrase[2]);
	MIOS_LCD_PrintCString("] +");
	MIOS_LCD_PrintHex2(phrase[6]);

	// ROW 4 ////// 
	MIOS_LCD_CursorSet(0xC0);
	MIOS_LCD_PrintCString(" [");
	MIOS_LCD_PrintHex2(phrase[3]);
	MIOS_LCD_PrintCString("] +");
	MIOS_LCD_PrintHex2(phrase[7]);

	//SHOW POSITION
	switch(editstep){
		case 0:	MIOS_LCD_CursorSet(0x00);break;
		case 1:	MIOS_LCD_CursorSet(0x40);break;
		case 2:	MIOS_LCD_CursorSet(0x80);break;
		case 3:	MIOS_LCD_CursorSet(0xC0);break;
	}
	MIOS_LCD_PrintChar(0x04);//pointer
}



HEX_KEY(unsigned char pin){
	switch (pin){
		case 28:return 0;break;// 0
		case 56:return 1;break;// 1
		case 60:return 2;break;// 2
		case 48:return 3;break;// 3
		case 52:return 4;break;// 4
		case 40:return 5;break;// 5
		case 44:return 6;break;// 6
		case 32:return 7;break;// 7
		case 36:return 8;break;// 8
		case 24:return 9;break;// 9
		case 50:return 10;break;// A
		case 39:return 11;break;// B
		case 47:return 12;break;// C
		case 42:return 13;break;// D
		case 53:return 14;break;// E
		case 46:return 15;break;// F
	}
	return -1;
}



void EDITOR(void){//PHRASE EDITOR

	unsigned char hex;

	if(EDIT==0){
		EDIT=1;
		EDIT_DRAW();
		instep=0;
		editstep=0;
		return;
	}

	n1=(phrase[editstep] >>4) & 0x0f;// upper nibble
	n2=phrase[editstep] & 0x0f;		// lower nibble

	hex=HEX_KEY(last_mx_pin);
	if(hex<16){

		if(instep==0){
			phrase[editstep]=hex*16+n2;
			instep=1;
		}else{
			phrase[editstep]=n1*16+hex;
			instep=0;
		}

		EDIT_DRAW();
		return;
	}

	switch(last_mx_pin) {

		case 3://prev
			editstep--;
			if(editstep==0xff)editstep=3;
			EDIT_DRAW();
			return;break;

		case 2://next
			editstep++;
			if(editstep>3)editstep=0;
			EDIT_DRAW();
			return;break;

		case 7:editstep=0;instep=0;EDIT_DRAW();return;break;//F1-F2
		case 6:editstep=1;instep=0;EDIT_DRAW();return;break;//F3-F4
		case 5:editstep=2;instep=0;EDIT_DRAW();return;break;//F5-F6
		case 4:editstep=3;instep=0;EDIT_DRAW();return;break;//F7-F8

		case 16:phrase[editstep+4]++;instep=0;EDIT_DRAW();return;break;// +
		case 20:phrase[editstep+4]--;instep=0;EDIT_DRAW();return;break;// -


		case 62://Commodore key -> REC (Edit pattern)
			EDIT=0;
			REC();
			return;
			break;

		case 57://esc
			EDIT=0;
			def();
			return;break;
	}

	return;
}


void CC_draw(){
	MIOS_LCD_Clear();//
	MIOS_LCD_CursorSet(0x00);
	MIOS_LCD_PrintCString("Set CC for CHN");
	MIOS_LCD_PrintBCD2(midi_channel+1);
	MIOS_LCD_CursorSet(0x40);
	MIOS_LCD_PrintCString("Old :");
	MIOS_LCD_PrintBCD3(MIOS_EEPROM_Read(0x10 + midi_channel));
	MIOS_LCD_CursorSet(0x80);
	MIOS_LCD_PrintCString("New :");
	MIOS_LCD_PrintBCD1(int_buffer[0]);
	MIOS_LCD_PrintBCD1(int_buffer[1]);
	MIOS_LCD_PrintBCD1(int_buffer[2]);
}

void CC_edit(){//SET 'MAIN' CC (for main pot)

	unsigned char cc=0;
	unsigned char hex=0;

	if(CC==0){
		CC=1;
		CC_draw();
		instep=0;
		int_buffer[0]=0;
		int_buffer[1]=0;
		int_buffer[2]=0;
		return;
	}
	
	switch(last_mx_pin){

		case 57://ESC
			CC=0;def();return;break;

		case 0://DEL
			MIOS_LCD_CursorSet(0x85+instep);
			MIOS_LCD_PrintCString(" ");
			if(instep>=1)instep--;
			return;break;

		case 1://RETURN
			cc=int_buffer[0]*100+int_buffer[1]*10+int_buffer[2];
			MIOS_EEPROM_Write(0x10 + midi_channel,cc);
			CC=0;def();return;break;
	}
	
	hex=HEX_KEY(last_mx_pin);
	if(hex<10){
		MIOS_LCD_CursorSet(0x85+instep);
		MIOS_LCD_PrintBCD1(hex);
		int_buffer[instep]=hex;
		if(instep<2)instep++;
	}
	return;
}




void SONGPOS(unsigned char spos){//SET SONG POSITION (1 to 16 W SPACE+UPKEYS)
	song_pos=spos;
	//MIOS_LCD_CursorSet(0x80);
	//MIOS_LCD_PrintCString("SONGPOS : ");
	//MIOS_LCD_PrintBCD2(song_pos);	//song_pos
	def();
}

/*
void compute(unsigned char val,unsigned char mc){//output midi data.

	if(val==0x80){//SILENCE
	}else if(val==0x81){//PAD
	}else{//PLAY
		MIOS_MIDI_TxBufferPut(144 + midichan);//Note on
		MIOS_MIDI_TxBufferPut(hold1[i]);
		MIOS_MIDI_TxBufferPut(0x00);//velocity
	}
	hold1[mc]=val;
	return;
}
*/





