/* Arduino USB MIDI demo */
#define D 0x80 //Comando desactivar nota
#define A 0x90 //Comando activar nota
#define PITCH 0xE0 //Comando para Pitch
#define Sustain 0x40 //Perdal de Sustain
unsigned int pitchWheel = 0x2000; //Variable de para pitch wheel
unsigned int pitchRegister = 0x01FF; //Registro del pitch
/* Definiciones de notas */
#define nC2 0x24 //Octava 2
#define nC3 0x30 //Octava 3
#define nC4 0x3C //Octava 4 Valor de Do central
#define nC5 0x48 //Octava 5
#define nC6 0x54 //Octava 6Do final alto
unsigned char base = nC2; //Octava base del teclado (nota más grave), cambiarlo permite correr las notas una octava
/* Pines Matriz*/
#define KI0 2
#define KI1 3
#define KI2 4
#define KI3 5
#define KI4 6
#define KI5 7
#define KI6 8
/* Pines Latch */
#define clock 9
#define data 10
/* Registro de Matriz*/
unsigned char KO[8] = {0,0,0,0,0,0,0,0};
unsigned char IndexKO = 0; //Indice de salidas
unsigned char IndexKI = 0; //indice de entradas
unsigned char Key = 0; //Filtro de tecla
unsigned char velocidad = 127; //volumen de teclas
boolean sustain = false;
unsigned char N = 0x24;
/* Formato para enviar el comando [comando][canal][dato1][dato2] */
void nota(char comando, char canal, char dato1) //dato 2 es velocidad de la nota
{
Serial.write(comando);
Serial.write(canal);
Serial.write(dato1);
Serial.write(velocidad);
}
void Control(unsigned char control, unsigned char canal, unsigned char valor)
{
Serial.write(0xB0); //Modo de Control
Serial.write(canal);
Serial.write(control);
Serial.write(valor);
}
void setup();
void loop();
void SSClear()
{
digitalWrite(data, HIGH);
for(int i = 0; i < 8; i++){
digitalWrite(clock, LOW);
digitalWrite(clock, HIGH);
}
IndexKO = 0;
}
void Next()
{
if (IndexKO == 0)
{
digitalWrite(clock, LOW);
digitalWrite(data, LOW);
digitalWrite(clock, HIGH);
digitalWrite(data, HIGH);
}
else
{
digitalWrite(clock, LOW);
digitalWrite(clock, HIGH);
}
IndexKO++;
if (IndexKO == 8){IndexKO = 0;}
}
void setup()
{
pinMode(KI0, INPUT_PULLUP);
pinMode(KI1, INPUT_PULLUP);
pinMode(KI2, INPUT_PULLUP);
pinMode(KI3, INPUT_PULLUP);
pinMode(KI4, INPUT_PULLUP);
pinMode(KI5, INPUT_PULLUP);
pinMode(KI6, INPUT_PULLUP);
pinMode(data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(115200);
SSClear();
delay(1000);
digitalWrite(13, LOW);
KO[IndexKO] = 0;
}
void Scan() //Funcion para escanear la matriz y enviar las notas
{
/**********************************************************************
* Escaneo De Matriz *
**********************************************************************/
while(1)
{
Next(); //Inicio de escaneo
N = base;
IndexKI = 0x40;
Key = KO[IndexKO] & IndexKI; //Reconocimiento para KI0
if (digitalRead(KI0) == LOW)
{
if (Key == 0){nota(A, 1, N); KO[IndexKO] |= IndexKI;}
}
else
{
if (Key != 0){nota(D, 1, N); KO[IndexKO] &= ~IndexKI;}
}
N += 8;
IndexKI = IndexKI >> 1;
Key = KO[IndexKO] & IndexKI; //Reconocimiento para KI1
if (digitalRead(KI1) == LOW)
{
if (Key == 0){nota(A, 1, N); KO[IndexKO] |= IndexKI;}
}
else
{
if (Key != 0){nota(D, 1, N); KO[IndexKO] &= ~IndexKI;}
}
N += 8;
IndexKI = IndexKI >> 1;
Key = KO[IndexKO] & IndexKI; //Reconocimiento para KI2
if (digitalRead(KI2) == LOW)
{
if (Key == 0){nota(A, 1, N); KO[IndexKO] |= IndexKI;}
}
else
{
if (Key != 0){nota(D, 1, N); KO[IndexKO] &= ~IndexKI;}
}
N += 8;
IndexKI = IndexKI >> 1;
Key = KO[IndexKO] & IndexKI; //Reconocimiento para KI3
if (digitalRead(KI3) == LOW)
{
if (Key == 0){nota(A, 1, N); KO[IndexKO] |= IndexKI;}
}
else
{
if (Key != 0){nota(D, 1, N); KO[IndexKO] &= ~IndexKI;}
}
N += 8;
IndexKI = IndexKI >> 1;
Key = KO[IndexKO] & IndexKI; //Reconocimiento para KI4
if (digitalRead(KI4) == LOW)
{
if (Key == 0){nota(A, 1, N); KO[IndexKO] |= IndexKI;}
}
else
{
if (Key != 0){nota(D, 1, N); KO[IndexKO] &= ~IndexKI;}
}
N += 8;
IndexKI = IndexKI >> 1;
Key = KO[IndexKO] & IndexKI; //Reconocimiento para KI5
if (digitalRead(KI5) == LOW)
{
if (Key == 0){nota(A, 1, N); KO[IndexKO] |= IndexKI;}
}
else
{
if (Key != 0){nota(D, 1, N); KO[IndexKO] &= ~IndexKI;}
}
N += 8;
IndexKI = IndexKI >> 1;
Key = KO[IndexKO] & IndexKI; //Reconocimiento para KI6
if (digitalRead(KI6) == LOW)
{
if (Key == 0){nota(A, 1, N); KO[IndexKO] |= IndexKI;}
}
else
{
if (Key != 0){nota(D, 1, N); KO[IndexKO] &= ~IndexKI;}
}
//Romper en index 7
if(IndexKO == 7) break;
}
}
void pitchControl()
{
unsigned int Analogo;
unsigned int tolerancia;
unsigned char LSB;
unsigned char MSB;
Analogo = analogRead(A1);
tolerancia = Analogo & 0x1E0;
if (pitchRegister != tolerancia)
{
pitchRegister = tolerancia;
Analogo = Analogo - 511;
Analogo = Analogo * 15;
pitchWheel = 0x2000 + Analogo;
LSB = pitchWheel & 0x7F;
MSB = (pitchWheel >> 7) & 0x7F;
Serial.write(PITCH);
Serial.write(1);
Serial.write(LSB);
Serial.write(MSB);
/*Serial.print("Rueda: ");
Serial.println(pitchWheel);
Serial.print("MSB Hex: ");
Serial.print(MSB, HEX);
Serial.print(" LSB Hex: ");
Serial.println(LSB, HEX);*/
}
}
void loop()
{
int Analogo;
Analogo = analogRead (A0); //Lectura de velocidad
velocidad = Analogo / 8; //Conversion de 10 a 7 bits
Scan(); //Escaneo de matriz*/
//pitchControl(); //Lectura del control de pitch
}