Piano MIDI con arduino.

#1 por Man with the x-ray eyes el 20/12/2012
Hola,
Hoy os traigo el esquema y el código para construir un piano MIDI con arduino.
Este proyecto solo incluye dos notas (Si y Do), para poner más solo habría que copiar y modificar los datos correspondientes del código hasta que nos quedemos sin pines en el arduino o si no, pues a multiplexar.
Ingredientes:
1 arduino
2 botones
2 resistencias de 10k
1 resistencia de 220 Ohms
1 conector Midi
cable, soldador, estaño...

Código
Alguien escribió:

const int buttonDoPin = 2;
const int buttonSiPin = 3;
int noteDo = 71; //MIDI note 69=A (440hz)
int noteSi= 72;
int buttonDoState = 0;
int buttonSiState = 0;// current state of the button
int lastButtonDoState = 0;
int lastButtonSiState = 0;
int val;
void setup() {
// initialize the button pin as a input:
pinMode(buttonDoPin, INPUT);
pinMode(buttonSiPin, INPUT);
// initialize serial communication:
// Set MIDI baud rate:
Serial.begin(31250);
}
void loop() {

buttonDoState = digitalRead(buttonDoPin);
if (buttonDoState == 0)
{ noteOn(0x90, noteDo, 0x00);}
else if (buttonDoState == lastButtonDoState)
{}
else { noteOn(0x90, noteDo, 0x45);}

buttonSiState = digitalRead(buttonSiPin);
if (buttonSiState == 0)
{ noteOn(0x90, noteSi, 0x00);}
else if (buttonSiState == lastButtonSiState)
{}
else { noteOn(0x90, noteSi, 0x45);}

lastButtonDoState = buttonDoState;
lastButtonSiState = buttonSiState;
}

void noteOn(int cmd, int pitch, int velocity) {
Serial.write(byte (cmd));
Serial.write(byte (pitch));
Serial.write(byte (velocity));
}

Esquema

cualquier duda,pregunta, y sobre todo, cualquier mejora es bienvenida
Saludos
Archivos adjuntos:
piano MIDI_bb.jpg
BBCode:
Subir
#2 por jBetances el 21/12/2012
No es mejor por USB?

Sin firma, por ahora...

Subir
#3 por Man with the x-ray eyes el 21/12/2012
Si lo que quieres es conectarlo a un ordenador de la oficina, pues sí. Pero para eso mejor comprar uno por 50 pavos que tendrá sensibilidad y alguna función más.
Lo que yo propongo es una base para crear controladores Midi más funcionales, p ej: estoy tocando la guitarra en un concierto y con el pie piso un interruptor que está conectado a un sinte con Midi in y disparo un efecto, ahí el USB...
A partir de ahí la imaginación de cada uno para desarrollar su proyecto en función de sus necesidades.
Por otra parte, si sabes como enviar Midi por el USB del arduino se agradecería que lo postearas, porque yo no tengo ni idea y seguro que alguien lo prefiere,
Saludos
Subir
#4 por Israel Ugalde Labajos el 22/12/2012
#3 buenas buen proyecto el tema de enviar midi por usb es un tema intersante.
Subir
#5 por Man with the x-ray eyes el 23/12/2012
Gracias Israel,
Como decía en el post anterior, en mi opinión una conector MIDI me parece una opción con más posibilidades que un USB, que en principio solo valdría para conectarlo al ordenador en caso de no tener una entrada MIDI en la tarjeta de sonido.
Por otra parte, enviar MIDi por el pin serial del arduino es muy sencillo, solo tienes que iniciar el serial a la velocidad adecuada (31250) y ya tienes comunicación MIDI. Para enviarlo por el USB, no sé si será tan sencillo, la verdad es que no lo he mirado.

Quizás el título del post no es muy adecuado, más que un piano MIDI, es un teclado controlador MIDI, en el más amplio sentido de la palabra, ya que con esto podrías hacer un teclado al uso, o incluso un arpa inalámbrica, con los sensores adecuados y alguna pequeña modificación del código.

Saludos!
Subir
#6 por Israel Ugalde Labajos el 23/12/2012
y seria posible mandar midi en note en vez de en cc?para poder asi utlilizar con el drum rack de ableton?
Subir
#7 por Man with the x-ray eyes el 23/12/2012
Claro, si te fijas en el código, cuando pulsas el boton envias note On y cuando lo sueltas, note Off (note On 0), lo siguiente con lo que tengo que ponerme es enviar precisamente los CC.
Con este proyecto estás enviando notas al canal1 del MIDI.
Alguien escribió:
else { noteOn(0x90, noteDo, 0x45);}

noteOn: enviás una nota
ox90: por el canal 1
noteDo: al principio he definido que noteDo= 71, que en notas MIdi es un do, no recuerdo en que octava.
0X45: la velocidad.
No tengo el Ableton, pero si el Drum Rack es una instrumento virtual de baterías, pues cada nota tendrá asignado un sonido , (p.ej: do de la primera octava es un bombo, Re una caja, pues si te interesa usar esos sonidos solamente, al principio del código defines la nota que corresponda y al pulsar el botón tendrás ese sonido si tienes el Drum rack en el canal 1 de MIDI)
no sé si me he explicado muy bien,
Saludos
Subir
#8 por Israel Ugalde Labajos el 25/12/2012
the man with the x-ray eyes escribió:
Por otra parte, enviar MIDi por el pin serial del arduino es muy sencillo, solo tienes que iniciar el serial a la velocidad adecuada (31250) y ya tienes comunicación MIDI.
perdon por mi ignorancia pero donde cambias la velocidad del serial
Subir
1
#9 por Man with the x-ray eyes el 25/12/2012
En la función "setup":
// Set MIDI baud rate:
Serial.begin(31250);
Eso es que inicias la comunicación serial a esta velocidad.
Saludos!
Subir
#10 por Israel Ugalde Labajos el 27/12/2012
muchas gracias ya me di cuenta de donde va y cojiendo tu proyecto lo prepare para cuando presionara el pulsador encienda un led aora la duda es: como se podria hacer para tener mas pulsadores unos 20 o 22 :

const int button1Pin = 2;

int nota1 = 2; //numero de nota en drum rack
int led1=3; //numero de pin para led
int pulsador1=2; // numero de pin para pulsador
int button1State = 0;
int lastButton1State = 0;
int val;
void setup() {
pinMode(pulsador1, INPUT); //Configurar el pulsador como una entrada
pinMode(led1,OUTPUT); //Configurar el LED como una salida

// initialize the button pin as a input:
pinMode(button1Pin, INPUT);

// initialize serial communication:
// Set MIDI baud rate:
Serial.begin(31250);
}
void loop() {
//Condicional para saber estado del pulsador
if (digitalRead(pulsador1)==HIGH)
{
//Pulsador oprimido
digitalWrite(led1,HIGH); //Enciende el LED
}
else
{
//Pulsador NO oprimido
digitalWrite(led1,LOW); //Apaga el LED
}

button1State = digitalRead(button1Pin);
if (button1State == 0)
{ noteOn(0x90, nota1, 0x00);}
else if (button1State == lastButton1State)
{}
else { noteOn(0x90, nota1, 0x45);}
lastButton1State = button1State;

}

void noteOn(int cmd, int pitch, int velocity) {
Serial.write(byte (cmd));
Serial.write(byte (pitch));
Serial.write(byte (velocity));
}
espero no estar estropeandote el post un saludo
Subir
#11 por Man with the x-ray eyes el 27/12/2012
Buenas!
para nada lo estropeas, al contrario, de eso se trata,
para poner 20 ó 22 pulsadores, hay dos opciones:
la primera es usar el arduino Mega, que creo que tiene 54 pines digitales o el Leonardo, que si no recuerdo mal tiene 20, y repetir el código de pulsador1, hasta pulsador20, definiendo las notas que correspondan.
La segunda es multiplexar, cosa que no controlo, pero en este foro me han hablado de una placa, "Mux shield" que creo que lo facilita bastante.
Saludos!
Subir
#12 por Israel Ugalde Labajos el 27/12/2012
yo soy novato en esto compre una mega 2560 este lunes y la idea principal es usar 20 pulsadores que asu vez encienda independientes led y poner 3potenciometros uno de ellos sin fin que me recomiendas para ese tinglado:resistencias que tipo de potenciometros y si ves algo raro en el esquema me comentas .un saludo artista
Subir
#13 por Man with the x-ray eyes el 28/12/2012
Si tienes el mega es fácil entonces, pero te vas a hartar de definir pines...
Tienes 54 pines digitales, así que tienes de sobra. Si pones por ejemplo los pines 1-20 para los botones y 21-40 para los leds, siguiendo con el código como lo estabas haciendo en principio debería funcionar. ¿Has probado ya el código que subiste?
Los potenciómetros, ¿Para qué los vas a utilizar?
Saludos!
Subir
#14 por Israel Ugalde Labajos el 28/12/2012
la idea de los potenciometros es para controlar efectos, pero tengo una duda como los tendre que programar y de que tipo los necesitaria, tengo un par de 10 k que no se si serviran.y el esquema esta funcional con una nota midi y un led la idea es copiar parametros pero me lio y copio modifico y me da fallos nose esactamente que parametros tendre que copiar y modificar.
Subir
#15 por Man with the x-ray eyes el 29/12/2012
Ahora estoy bastante liado y no tengo mucho tiempo para mirarlo, en unos días te doy una respuesta más extensa,
básicamente:
definir al principio del código todos los pulsadores:
Alguien escribió:

int nota1 = 2; //numero de nota en drum rack
int led1=3; //numero de pin para led
int pulsador1=2; // numero de pin para pulsador
int button1State = 0;
int lastButton1State = 0;


Esto con cada pulsador que pongas, cambiando a pulsador2, pulsador3...

Después en la función loop:
Alguien escribió:
//Condicional para saber estado del pulsador
if (digitalRead(pulsador1)==HIGH)
{
//Pulsador oprimido
digitalWrite(led1,HIGH); //Enciende el LED
}
else
{
//Pulsador NO oprimido
digitalWrite(led1,LOW); //Apaga el LED
}

button1State = digitalRead(button1Pin);
if (button1State == 0)
{ noteOn(0x90, nota1, 0x00);}
else if (button1State == lastButton1State)
{}
else { noteOn(0x90, nota1, 0x45);}
lastButton1State = button1State;

}

igual, repetir lo mismo para pulsador2, pulsador3...
Creo que sería más rápido, haciendo un array, pero ahí también me pierdo...

En cuanto a los potis, en principio supongo que dará igual que valor tengan, porque tendrás que mapear los valores de 0-1023 que da el potenciometro a los valores MIDI, (supongo que de 0-127, pero no estoy seguro). ëchale un vistazo a los tutoriales de la página de arduino a ver si sacas algo en claro. http://arduino.cc/en/Tutorial/AnalogReadSerial

Saludos!
Subir
Respuesta rápida

Regístrate o para poder postear en este hilo