/* Copyright 2010 Daniele Rapagnani */
/* Reescrito en CCS por Coco */

#define	MIDI_NOTE_ON			0x90
#define MIDI_NOTE_OFF			0x80
#define MIDI_KEY_PRESSURE		0xA0
#define MIDI_CTRL_CHANGE		0xB0
#define MIDI_PROGRAM			0xC0
#define MIDI_CHN_PRESSURE		0xD0
#define MIDI_PITCH_BEND			0xE0	

#define midi_send_note_on(c, n, v)			midi_send_message(MIDI_NOTE_ON, c, n, v, 1)
#define midi_send_note_off(c, n, v)			midi_send_message(MIDI_NOTE_OFF, c, n, v, 1)

#define midi_send_key_pressure(c, n, p)		midi_send_message(MIDI_KEY_PRESSURE, c, n, p, 1)

#define midi_send_ctrl_change(c, cn, cv)	midi_send_message(MIDI_CTRL_CHANGE, c, cn, cv, 1)

#define midi_send_program(c, pn)			midi_send_message(MIDI_PROGRAM, c, pn, 0, 0)

#define midi_send_channel_pressure(c, pn)	midi_send_message(MIDI_CHN_PRESSURE, c, pn, 0, 0)

#define midi_send_pitch_bend(c, bmsb, blsb)	midi_send_message(MIDI_PITCH_BEND, c, bmsb, blsb, 1)

#byte TXSTA = 0x98
#byte RXSTA = 0x18
#byte SPBRG = 0x99
#byte TXREG = 0x19
#byte PIR1  = 0x0C
#byte INTCON  = 0x0B

#bit GIE  = 0x0B.7
#bit PEIE = 0x0B.6
#bit TXIF = 0x0C.4

//#byte TX9D  = 0x98.0        
#bit TRMT = 0x98.1
#bit BRGH = 0x98.2
#bit SYNC = 0x98.4
#bit TXEN = 0x98.5  
#bit TX9 = 0x98.6
//#byte CSRC = 0x98.7        

//#bit RX9D  = 0x18.0        
//#bit OERR  = 0x18.1
//#bit FERR  = 0x18.2
//#bit ADDEN = 0x18.3
#bit CREN  = 0x18.4
//#bit SREN = 0x18.5  
#bit RX9 = 0x18.6
#bit SPEN = 0x18.7  


void midi_init(void)
{
	SPBRG = 1;
	BRGH  = 0;
    SYNC  = 0;
	TX9   = 0;
	SPEN  = 1;
	TXEN  = 1;
	CREN  = 0;
	RX9   = 0;
	GIE   = 1;
	PEIE  = 1;
}

void uart_out(char data)
{
	TXREG = data;

	while(!TRMT);
}

 void midi_send_message(char cmd, char chn, char byte1, char byte2, short int send_byte2)
 {

	uart_out(cmd | chn);

	uart_out(byte1);
	
	if (send_byte2)
		uart_out(byte2);
}