MIDI - CAPITULO 3 - ENVIANDO SEÑALES MIDI VARIABLES CON DOS POTENCIOMETROS
Hola de nuevo. He avanzado un poco mas y, por si no se te ocurre como colocar dos potenciómetros, en este ejercicio vamos a llevar la tarea a cabo.
Tengo que comentar que si he tardado tanto en ponerlo es porque yo he tenido problemas a la hora de recibir los datos en el ordenador, y en algunas ocasiones giraba el potenciómetro 0 y cuando veía los datos en el programa s2midi me salía entre medio una nota del potenciómetro 1. En este código que coloco mas adelante no me ha pasado, pero me extraña, porque he modificado varias veces los datos y siempre me pasaba lo mismo. No se, quizás me faltaba algo por cambiar en el código.
Edito: EL MOTIVO POR EL QUE ME SALIA UNA NOTA DEL POTENCIOMETRO 1 ENTRE MEDIO DE LA DEL POTENCIOMETRO 0 Y VICEVERSA, ES DEBIDO A LA TOLERANCIA DEL POTENCIOMETRO.
- ¿QUE QUIERE DECIR? PUES QUE SI EL POTENCIOMETRO TIENE UNA TOLERANCIA DEL 5% SIGNIFICA QUE SU RESISTENCIA PUEDE VARIAR LIGERAMENTE EN CUALQUIER MOMENTO.
- ¿COMO ME AFECTA ESTO? PUES AFECTA PORQUE AL VARIAR LIGERAMENTE CAMBIA EL VALOR Y EL PROGRAMA ENTIENDE QUE HEMOS GIRADO EL POTENCIOMETRO, POR ESO ENVIA ESA NOTA.
- ¿COMO SE PUEDE ARREGLAR? PUES LIGERAMENTE SE PUEDE ARREGLAR AL ESTILO CHAPUZA, VARIANDO EL VALOR DE LAS VARIABLES analogSmoothx = 2; por analogSmoothx = 6; CON ESTO ES MAS DIFICIL DE QUE SALGA ESA NOTA, PERO TIENE UNA DESVENTAJA, TENEMOS QUE GIRAR MAS EL POTENCIOMETRO PARA QUE SE DETECTE EL CAMBIO.
- ¿HAY OTRA SOLUCION? SI, PUEDES GASTARTE MAS DINERO EN COMPRAR POTENCIOMETROS DE MAS CALIDAD, O PUEDES ESPERAR A QUE ENCUENTRE UN CODIGO QUE EVITE ESTO, PERO DE MOMENTO NO SE ME OCURRE NINGUNO.
ES TODO.
Bien, la colocación de dos potenciómetros es igual que cuando colocamos uno, solo que la patilla central del segundo potenciómetro tiene que ir a 1 analógico.
Después subimos el siguiente código a la placa y listo.
int midiChannel0 = 1;
int analogPin0 = 0;
int lastAnalog0 = 0;
int analogSmooth0 = 2;
int midiChannel1 = 1;
int analogPin1 = 1;
int lastAnalog1 = 0;
int analogSmooth1 = 2;
void setup()
{
Serial.begin(31250);
}
void loop()
{
Potenciometro0();
Potenciometro1();
}
void Potenciometro0()
{
int reading0 = 0;
reading0 = analogRead(analogPin0)/8;
if (abs(reading0-lastAnalog0) > analogSmooth0)
{
lastAnalog0 = reading0;
controlChange(midiChannel0,10,reading0);
}
}
void Potenciometro1()
{
int reading1 = 0;
reading1 = analogRead(analogPin1)/8;
if (abs(reading1-lastAnalog1) > analogSmooth1)
{
lastAnalog1 = reading1;
controlChange(midiChannel1,127,reading1);
}
}
void controlChange(byte channel, byte controller, byte value)
{
midiMsg(channel+0xB0, controller, value);
}
void midiMsg(byte cmd, byte data1, byte data2)
{
Serial.print(cmd, BYTE);
Serial.print(data1, BYTE);
Serial.print(data2, BYTE);
}
Cualquier programador normalito sabrá que este código se puede reducir mucho, pero después de lo que he sudado para llegar aquí no tengo muchas ganas de ponerme a recortarlo. Se que es muy importante recortar código para que tengamos espacio suficiente en la placa donde meterlo, pero por el momento no tengo ganas de complicarme mas la existencia. Por suerte, la versión duemilanove con el ATMEGA 328 tiene mucho espacio, y Serra cuestión de tiempo que tengamos placas con mucho mas donde almacenar, de hecho, ya hay placas arduino con muchísimo mas espacio y mucha mas velocidad de procesamiento, pero no podemos comprarnos una cada dos por tres.
Seguimos. He puesto en color rojo el código que forma parte del potenciómetro 0 (que es el 1º potenciómetro) y en verde el del potenciómetro 1 (que es el 2º potenciómetro). El resto del código es común a los dos y creo que con esto deberías saber como conectar mas de dos.
Ahora pasamos a describir el código.
Como puedes observar, al principio del código tenemos las cuatro variables que son del potenciómetro 0 y después las otras cuatro que son del potenciómetro 1.
A continuación configuramos el puerto serial a 31250.
Seguimos con el código y entramos en la función loop(), donde llamamos primero a la función Potenciometro0(). Una vez allí leemos el potenciómetro y si lo hemos variado llamamos a la función controlChange y le pasamos el canal (1), la nota (10) y por ultimo el valor del potenciómetro. La función controlChange() hace una pequeña modificación de los datos recibidos y llama a midiMsg() pasándole los datos y esta ultima coloca los 3 datos en el puerto usb uno detrás de otro. Aquí es donde S2Midi entra en acción, convirtiendo los 3 datos en señal midi y enviándolos al puerto midi virtual.
(En el código del articulo anterior olvide comentaros que la división entre 8 que se hace en la línea "reading0 = analogRead(analogPin0)/8;" es para convertir el valor del potenciómetro en un numero entre 0 y 127, es decir, en el volumen de la nota)
¿Por donde íbamos? Si, ya me acuerdo, habíamos terminado de comentar lo que pasaba si se había movido el potenciómetro 0. Si no lo hubiéramos movido sencillamente hubiéramos vuelto a la función loop() y seguiríamos por la segunda instrucción, que llama a la función Potenciometro1() y hace exactamente lo mismo que en la anterior, es decir, si varia, llama a controlChange pasándole los datos, después controlChange llama a midiMsg tras hacer una modificación de los datos y esta por ultimo envía las tres señales al puerto usb.
Todo esto sucede a una velocidad bastante alta y se estaría ejecutando constantemente para comprobar si hay algún cambio en los potenciómetros.
Por ultimo quiero indicaros que en este código estamos mandando los datos del siguiente modo:
Potenciometro0 -- Canal 1 -- Nota 10 -- Valor del potenciometro0/8
Potenciometro1 -- Canal 1 -- Nota 127 -- Valor del potenciometro1/8
Por esto, podemos observar que en la línea controlChange(midiChannel0,10,reading0); de la función Potenciometro0() estamos mandando la nota 10, en cambio, en la de la función Potenciometro1() mandamos la nota 127.
Es todo por hoy. Saludos y por favor, si alguien me lee que me deje un comentario, aunque sea un saludo o algo para saber que no estoy escribiendo para que nadie me lea :D
1 comentarios:
Hola, te felicito por este artículo, estoy muy interesado en crear me una controladora de DJ,
Si quiero poner más potenciometros, solo tengo que duplicar las líneas de Código que están en rojo y verde? , el total de potenciometros son 16 los que quiero poner en una Arduino mega,
No tengo nada de idea de programar, solo intento adaptar los códigos a mis necesidades
Gracias, un saludo
Publicar un comentario