Crear codigo midi con entradas digitales.

Hola compañeros, soy nuevo en esto y estoy creando un proyecto pero tengo problemas al crear el codigo. Ya he encendido algun led y he hecho sonar mi arduino mediante protocolo midi en mi ordenador, pero soy incapaz de crear un codigo para poder enviar midi a mi ordenador mediante las entradas digitales. He visto todos los ejemplos que hay referente a midi con arduino pero la mayoria utiliza la entrada analogica. A ver si me podeis orientar para poder crear el codigo mediante entradas digitales. Mi proyecto en principio seria hacer una flauta midi utilizando switches y enviandolo al pc a traves del tx. Agradezco vuestra atencion y a ver si me podeis ayudar.

supongo que te referiras a algo asi:

si soplo { si todos los botones=1 manda do si todos menos 1=1 manda re .etc. } si no soplo apaga ultima nota

no se si te entendí bien

Echa una ojeada,

Saludos,

https://ccrma.stanford.edu/wiki/250a_Homemade_Digital_Musical_Instrument

Hola Caramono, Correcto seria algo asi segun la correspondencia de switches que estuvieran pulsados enviar una o otra nota por la salida tx. Hola cristal, He visto la pagina a la cual me has referenciado y en principio es algo asi, aunque no utilizaria la libreria firmata. El tema del sensor analogico lo haria con un sensor de presion y solo necesitaria tener tres estados, el primero sin presion por lo tanto no sonaria ninguna nota, el segundo presion media,, aqui sonaria una determinada escala, y el ultimo presion maxima que sonaria otra escala mas alta. En cuanto al hardware lo tengo bastante claro, mi problema viene con el codigo. Nunca he creado un codigo con entradas digitales y salida midi por tx. El software en el pc lo tengo solucionado utilizando midijokey y demas. Gracias por vuestro interes.y espero vuestras respuestas.

si no vas a usar firmata http://www.arduino.cc/playground/Main/InterfacingWithHardware#MIDI

A mi la MIDI library me ha quitado un gran peso de encima, y es muy facil de usar. En tu caso solo usarias sendNoteOn y sendNoteOff, siendo por ejemplo:

sendNoteOn(36,127,1)

Sonar do, a maximo volumen, en canal midi 1.

Espero que te haya ayudado.

Gracias caramono, Tendre que estudiarme la libreria, como se carga, terminos que tengo que utilizar concretamente para mi proyecto etc. Empezare por un codigo sencillo y lo ire complicando poco a poco hasta obtener lo que ando buscando. He intentado traducir el pdf de la libreria pero no lo traduce muy correcto asi que mirare de hacer lo que pueda y si tengo dudas pues utilizare este medio y asi servira de informacion a los demas usuarios. Gracias por vuestras respuestas.

Bueno, no acabo de aclararme. Tengo ya tantas cosas en la cabeza que necesito poner orden. Por partes, con este codigo de prueba logro encender y apagar un led según los pulsadores que tenga pisados.

int ledPin = 13; int inputPin1 = 2; // pulsador 1 int inputPin2 = 3; // pulsador 2 int inputPin3 = 4; // pulsador 3 int inputPin4 = 5; // pulsador 4 int inputPin5 = 6; // pulsador 5 int inputPin6 = 7; // pulsador 6 int inputPin7 = 8; // pulsador 7

int p1; int p2; int p3; int p4; int p5; int p6; int p7;

void setup() { pinMode(ledPin, OUTPUT); pinMode(inputPin1, INPUT); pinMode(inputPin2, INPUT); pinMode(inputPin3, INPUT); pinMode(inputPin4, INPUT); pinMode(inputPin5, INPUT); pinMode(inputPin6, INPUT); pinMode(inputPin7, INPUT);

}

void loop(){

p1=digitalRead(inputPin1); p2=digitalRead(inputPin2); p3=digitalRead(inputPin3); p4=digitalRead(inputPin4); p5=digitalRead(inputPin5); p6=digitalRead(inputPin6); p7=digitalRead(inputPin7);

if (p1 == HIGH & p2 == HIGH) { digitalWrite(ledPin, HIGH); } else if (p1 == LOW & p2 == LOW) { digitalWrite(ledPin, LOW); } }

hasta aqui bien. ahora quiero que en vez de encenderse el led 13, me envie un mensaje midi a traves del tx. Ya me ireis orientando. Gracias a todos y adelante con vuestros proyectos.

a ver, varias cosas:

  1. usa la funcion code del foro (es un boton #, arriba del tamañao de fuente) en vez de quote. mola mas :wink: .

para el midi:

#include<MIDI.h>

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(inputPin1, INPUT);
.
.
.
MIDI.begin(1);

}

asi inicias la libreria midi, y pones la comunicacion 31200 baudios (o los que toquen, no recuerdo) y tal y cual… vamos, que lo preparas todo.

y despues:

if (p1 == HIGH & p2 == HIGH) {
MIDI.sendNoteOn(36,127,1); // 36 es do, 127 es maximo volumen
} else if (p1 == LOW & p2 == LOW) {
MIDI.sendNoteOff(36,127,1);

y ya esta bien! te lo he puesto muy facil :stuck_out_tongue:
ahora tu solo. Dale fuerte!

Por fin, ya lo he hecho funcionar.
Ahora tendré que depurar el codigo ya que solo he utilizado dos pulsadores y tendré que utilizar siete pulsadores para obtener de momento 9 o 10 notas.
Lo que he podido observar que se retrasa mucho desde que sale la nota hasta que me deja volver a hacerlo sonar.
Ya me direis a que se debe, creo recordar haber leido algo en refrencia a la funciñon delay, ya me sacareis de dudas.
Ahora es cuando empiezo a disfrutar de arduino jejejeje.
Por cierto cuelgo el código y asi practico la función code.

#include <MIDI.h>
int inputPin1 = 2; // pulsador 1
int inputPin2 = 3; // pulsador 2
int p1;
int p2;

void setup() {
pinMode(inputPin1, INPUT);
pinMode(inputPin2, INPUT);

  MIDI.begin(1);                  
}

void loop() {
p1=digitalRead(inputPin1);
p2=digitalRead(inputPin2);
  if (p1 == HIGH & p2 == HIGH) {
MIDI.sendNoteOn(36,127,1); // 36 es do, 127 es maximo volumen
} else if (p1 == LOW & p2 == LOW) {
MIDI.sendNoteOff(36,127,1); 
          
  }
}

Hola, apenas comienzo con MIDI y arduino, pero no me funciona el ejemplo básico con el que viene el software... tienen algún ejemplo que me pueda ayudar....

Gracias