Codigo para bateria midi

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);
}

El baudrate de MIDI es 31250, no 57600.
¿Realmente se conecta?

La función nota_midi() dispara la nota y la apaga inmediatamente.
¿Llega a sonar algo?

Te sugiero que uses la librería MIDI.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.