//BATERIA MIDI CON ARDUINO MEGA 2560 Y SENSORES PIEZOELECTRICOS
// Canal MIDI del 0 a 15, +1 en el "mundo real"
#define canal 0;
// Notas MIDI de 0 a 127 (Mid C = 60) --> {Charles abierto, Caja,...}.
unsigned char Nota[15] = {17,33,49,38,36,38,38,10,48,11,51,9,45,20,53};
int Nota_pedal = 21; // Nota MIDI para el CIERRE PEDAL HIHAT
int Nota_pedalhhabierto = 23; // Nota MIDI para el CIERRE PEDAL HIHAT
int Sensibilidad_golpeo[15] = {380,380,380,380,380,380,380,380,380,380,380,380,380,380,380}; // Valor máximo 1023. A mayor valor menor sensibilidad.
// Tiempo de espera entre golpes en milisegundos (respuesta). A mayor valor menor respuesta de la batería electrónica.
int Respuesta[15] = {30,30,30,30,30,30,30,30,30,30,30,30,30,30,30};
// Variables para el control del pedal del HIHAT.
int Velocidad_pedal = 120; // Velocidad del pedal entre 0 y 127 (elige la que más te guste).
int Tiempo_maximo = 70; // Tiempo de espera del pedal para poder pisarle por segunda vez (Respuesta del pedal)
boolean Bandera_velocidad = true; // Variable interna para el control de la velocidad.
// Variables para el control de los PADS
boolean Pad_Activo[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // Matriz que almacena el estado inicial de los PADS (OFF).
int Comienzo_sonido[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // Matriz para contar el tiempo que dura la NOTA al golpear cada PAD.
// Variables internas para el pedal del HIHAT
int tiempo_pedal = 0; // Cuenta el tiempo desde que pisamos el pedal (inicialmente cero).
boolean hihat_activo = false; // Estado inicial del pedal del HIHAT
unsigned char status; // Variable para almacenar el ESTADO del mensaje MIDI (EStado NOTA MIDI <ON/OFF> + CANAL).
int Nota_ON = 144; // Variable con valor 144 que activa la NOTA MIDI.
int Nota_OFF = 128; // Variable con valor 128 que desactiva la NOTA MIDI.
int pedal = A5; // Pin digital para el interruptor del pedal del HIHAT
int valor_pedal; // Variable para almacenar el estado del pedal
int pin = 0; // Variable auxiliar para recorrer las matrices (Arrays)
int velocidad = 0; // Variable interna para el control de la velocidad de las NOTAS
// Variables para la función del CHARLES
int charles; // Pin ANALOGO para el pedal del charles
int estado_charles; // Variable que almacena el estado del pedal del Charles
void setup()
{
Serial.begin(57600); // Comienza la comunicación serie a 57600 BAUDIOS
pinMode(pedal, INPUT); // Pin digital 9 como ENTRADA
//pinMode(charles, INPUT); // Pin digital 8 como ENTRADA
}
void loop()
{
//Establecer pin A5 como pedal de HIHAT
charles = analogRead(A5);
//Serial.print("Entrada analógica = ");
//Serial.println(charles);
// Función que cambia la NOTA MIDI del charles en función del ESTADO del pedal charles
NOTA_Charles();
// Función para controlar los PADS
CONTROL_PADS();
}
// Función que transmite el mensaje MIDI
void MIDI_TX(unsigned char MENSAJE, unsigned char TONO, unsigned char VELOCIDAD)
{
status = MENSAJE + canal; // Estado de la NOTA MIDI (ON/OFF) + canal MIDI de transmisión
// Enviamos los valores por el puerto serie USB de ARDUINO
Serial.write(status); // Estado del mensaje
Serial.write(TONO); // Tono de la NOTA MIDI
Serial.write(VELOCIDAD); // Velocidad de la NOTA MIDI
}
// Función que cambia la NOTA MIDI del charles en función del ESTADO del pedal charles
void NOTA_Charles()
{
// Si no hemos pisado el pedal del Charles
if((charles >= 0)&&(charles<=199))
{
Nota[0] = 16; // Nota MIDI para Charles abierto
}
// Pasos intermedios de apertura de Charles
if((charles >= 200)&&(charles<=299))
{
Nota[0] = 15;
}
if((charles >= 300)&&(charles<=399))
{
Nota[0] = 14;
}
if((charles >= 400)&&(charles<=599))
{
Nota[0] = 12;
}
if((charles >= 600)&&(charles<=799))
{
Nota[0] = 22;
}
//Si hemos pisado el pedal del Charles
if(charles >= 800)
{
Nota[0] = 11; // Nota MIDI para Charles cerrado
}
}
// Función para controlar los PADS
void CONTROL_PADS()
{
// Recorremos las 5 entradas analógicas (A0, A1,....A4)
for(int pin=0; pin < 14; pin++)
{
// Guardamos el valor analógico de la entrada
velocidad = analogRead(pin);
// Si el golpe está dentro del tiempo de respuesta ..
if((velocidad > Sensibilidad_golpeo[pin]))
{
// Si el PAD no estaba activado
if((Pad_Activo[pin] == false))
{
// Calculamos la velocidad de golpeo
if(Bandera_velocidad == true)
{
velocidad = (velocidad / 8) -1 ;
}
else
{
velocidad = 127;
}
// Enviamos el mensaje MIDI para encender la NOTA
MIDI_TX(Nota_ON,Nota[pin],velocidad);
Comienzo_sonido[pin] = 0;
Pad_Activo[pin] = true;
}
// Si no hemos golpeado el PAD correspondiente
else
{
// Incremento el tiempo entre golpes en una unidad
Comienzo_sonido[pin] = Comienzo_sonido[pin] + 1;
}
}
// Si el PAD estaba ya activado
else if((Pad_Activo[pin] == true))
{
// Incremento el tiempo entre golpes en una unidad
Comienzo_sonido[pin] = Comienzo_sonido[pin] + 1;
// Si se ha superado el tiempo de respuesta
if(Comienzo_sonido[pin] > Respuesta[pin])
{
// Enviamos el mensaje MIDI para apagar la NOTA
MIDI_TX(Nota_OFF,Nota[pin],127);
Pad_Activo[pin] = false;
}
}
}
}