Convertir cero logico en note on

Hola amigos, Mi nombre es Simón Meléndez, soy chileno y nuevo en el foro y el mundo de arduino.

Como lo indica el topico, lo que quiero hacer es cuando arduino reciba un cero logico programar un mensaje midi de note on con sus correspondientes bytes de estado y datos y cuando reciba un 1 logico programar un note off.

Se como funciona la norma midi 1.0, pero no se como programar :( ¿me ayudarian con esta travesia?

Desde ya muchas gracias.

Hola Simón,

Prueba con este código. Creo que es lo que necesitas.

// Variables: 
boolean playing=0;

void setup() {
  Serial.begin(31250);  //  Set MIDI baud rate:
  pinMode(7, INPUT);
 }

void loop() {
  if (!playing &(digitalRead(7)==0)){
    playing=1;
    Serial.print(0x90, BYTE);    //Comando Note ON
    Serial.print(60, BYTE);      //Nota a tocar
    Serial.print(90, BYTE);      //Velocity
  }
  if (playing & (digitalRead(7)==1)){
    playing=0;
    Serial.print(0x80, BYTE);    //Comando Note OFF
    Serial.print(60, BYTE);      //Nota a silenciar
    Serial.print(0x00, BYTE);      //
  }
}

El código del envio MIDI puede expresarse como una funció y ser llamado dandole los parametros correspondientes, pero creo que tal como está aquí te ayudara mas a entender lo que se hace.
La entrada núm. 7 es la que se pondrá a nivel alto o nivel bajo para tocar la nota prefijada.
He introducido un flag indicador (playing) para no estar enviando constantemente ‘Note ON’ mientras sea cero la entrada.

Saludos!

Piniflopa, muchisimas gracias por cooperar con mi proyecto, te lo agradezco muchisimo.

Por el momento no puedo probarlo porque necesito comprar unas cosas que me faltan, me toca esperar hasta mañana, asi que durante la semana te cuento como me esta yendo con el codigo.

Nuevamente te lo agradezco.

:) :)

Bueno. Despues de muchos dias ausente en este topico vengo a decir que esta funcionando de maravillas.

Hice un pequeño cambio, ya que, el note off no me funciono, lo que hice fue asignar un nuevo note on es decir corregi el 0x80 por un 0x90 con una velocidad de cero, claro.

Ahora funciona =).

Pero tengo una nueva pregunta. A ver si mi amigo Piniflopa o cualquier interesado en este foro me pueda ayudar.

¿Como lo puedo hacer con mas entradas? es decir, ¿como serian los codigos? He tratado de muchas formas y hasta ahora nada.

Estare muy agradecido de ustedes.

;)

seria igual, pero comprobando una entrada cada vez. puedes usar un for()

void loop() {

for(int x=4;x<=8;x++)
  {
  if (!playing[x] &(digitalRead(x)==0)){
    playing[x]=1;
    Serial.print(0x90, BYTE);    //Comando Note ON
    Serial.print(60, BYTE);      //Nota a tocar
    Serial.print(90, BYTE);      //Velocity
  }
  if (playing[x] & (digitalRead(x)==1)){
    playing[x]=0;
    Serial.print(0x80, BYTE);    //Comando Note OFF
    Serial.print(60, BYTE);      //Nota a silenciar
    Serial.print(0x00, BYTE);      //
  }
  }
}

Asi compruebas los pins del 4 al 8, uno detras del otro.
tendrias que cambiar playing por un array, y cambiar las notas asignadas a cada uno, pero vamos, te haces una idea. :wink: