hola, consegui este codigo para armar una bateria midi pero todos los piezos suenan iguales (como redoblante) ya los conecte por separados en la entrada analoga 0,1,2,3,4,5, pero aun asi da el mismo sonido, y tambien necesito ajustar la sensibilidad porque todo suena con el mismo volumen, como podria modificar el codigo????? de ante mano gracias por la ayuda..
//----------------------------------------
// Notas
//----------------------------------------
#define Bombo 36
#define Redoblante 38
#define Tom_izq 48
#define Tom_der 45
#define Chancha 43
#define HiHat_cerrado 64
#define HiHat_abierto 60
#define HiHat_pedal 21
#define Crash_agudo 57
#define Crash_grave 55
#define Ride 51
#define MIDI_COMMAND_NOTE_ON 0x90 //144
#define MIDI_COMMAND_NOTE_OFF 0x80 //128
//----------------------------------------
// Constantes
//----------------------------------------
const int threshold = 40; // Mínimo valor leído
//----------------------------------------
// Variables
//----------------------------------------
int bombo, redo, ride, crash, hhat, tom;
unsigned char vel;
boolean bombo_b = 0, redo_b = 0, ride_b = 0, crash_b = 0, hhat_b = 0, tom_b = 0;
// Factores de sensibilidad para cada instrumento
float sensibilidadBombo = 1.0;
float sensibilidadRedoblante = 1.5;
float sensibilidadRide = 1.0;
float sensibilidadCrash = 1.1;
float sensibilidadTom = 1.0;
float sensibilidadHhat = 1.0;
//--------------------------------------------------------------------
#define MIDI_CHANNEL_BOMBO 0 // Canal 1 para el Bombo
#define MIDI_CHANNEL_REDOBLANTE 1 // Canal 2 para el Redoblante
#define MIDI_CHANNEL_RIDE 2 // Canal 3 para el Ride
#define MIDI_CHANNEL_CRASH 3 // Canal 4 para el Crash
#define MIDI_CHANNEL_TOM 4 // Canal 5 para el Tom
#define MIDI_CHANNEL_HH 5 // Canal 6 para el Hi-Hat
void nota_midi(char nota, int canal)
{
Serial.write(MIDI_COMMAND_NOTE_ON + canal); // Prende una nota en el canal específico
Serial.write(nota); // Envía la nota
Serial.write(vel); // Envía el volumen (velocidad)
Serial.write(MIDI_COMMAND_NOTE_OFF + canal); // Apaga la nota en el mismo canal
Serial.write(nota); // Envía la nota
Serial.write(127); // Velocidad de apagado
}
//----------------------------------------
// Prototipos
//----------------------------------------
void nota_midi(char nota);
char rango(long valor, float sensibilidad);
//----------------------------------------
// Inicialización
//----------------------------------------
void setup()
{
Serial.begin(57600);
pinMode(2, INPUT); // Pedal del HiHat
}
//----------------------------------------
// While(ON)
//----------------------------------------
void loop()
{
boolean pedal = digitalRead(2); // Comprueba HiHat
// Lee los valores
bombo = analogRead(0);
redo = analogRead(1);
ride = analogRead(2);
crash = analogRead(3);
hhat = analogRead(4);
tom = analogRead(5);
// Comprueba los valores leídos
if (bombo > threshold && bombo_b == 0)
{
vel = rango(bombo, sensibilidadBombo);
nota_midi(Bombo); // Kick
bombo_b = 1;
}
if (redo > threshold && redo_b == 0)
{
vel = rango(redo, sensibilidadRedoblante);
nota_midi(Redoblante); // Snare
redo_b = 1;
}
if (ride > threshold && ride_b == 0)
{
vel = rango(ride, sensibilidadRide);
nota_midi(Ride); // Ride
ride_b = 1;
}
if (crash > threshold && crash_b == 0)
{
vel = rango(crash, sensibilidadCrash);
nota_midi(Crash_agudo); // Crash
crash_b = 1;
}
if (tom > threshold && tom_b == 0)
{
vel = rango(tom, sensibilidadTom);
nota_midi(Tom_izq); // Tom
tom_b = 1;
}
if (hhat > threshold && hhat_b == 0)
{
if (pedal == 0)
{
nota_midi(HiHat_abierto); // HiHat abierto
}
else
{
nota_midi(HiHat_cerrado); // HiHat cerrado
}
hhat_b = 1;
vel = rango(hhat, sensibilidadHhat);
}
nota_midi(Bombo, MIDI_CHANNEL_BOMBO); // Kick
nota_midi(Redoblante, MIDI_CHANNEL_REDOBLANTE); // Snare
nota_midi(Ride, MIDI_CHANNEL_RIDE); // Ride
nota_midi(Crash_agudo, MIDI_CHANNEL_CRASH); // Crash
nota_midi(Tom_izq, MIDI_CHANNEL_TOM); // Tom
nota_midi(HiHat_abierto, MIDI_CHANNEL_HH); // HiHat abierto o cerrado
//-----------------
//| Apaga el loop |
//-----------------
if (bombo < threshold && bombo_b == 1) bombo_b = 0;
if (redo < threshold && redo_b == 1) redo_b = 0;
if (ride < threshold && ride_b == 1) ride_b = 0;
if (crash < threshold && crash_b == 1) crash_b = 0;
if (hhat < threshold && hhat_b == 1) hhat_b = 0;
if (tom < threshold && tom_b == 1) tom_b = 0;
}
//----------------------------------------
// Funciones
//----------------------------------------
char rango(long valor, float sensibilidad)
{
// Aplica la sensibilidad y normaliza el valor
return (valor * sensibilidad - threshold) * (127 - 64) / (1023 - threshold) + 64;
}
void nota_midi(char nota)
{
Serial.write(MIDI_COMMAND_NOTE_ON); // Prende una nota
Serial.write(nota); // Envía la nota
Serial.write(vel); // Envía el volumen (velocidad)
Serial.write(MIDI_COMMAND_NOTE_OFF); // Apaga la nota
Serial.write(nota);
Serial.write(127);
}