Joan Soler-Adillon || Programació: Conceptes
Espai 51.104 (Ed. La Nau, Ca l'Aranyó) || 93 542 2536
![]()
----------------------------------------------------------------
----------------------------------------------------------------
PROGRAMACIÓN: CONCEPTOS || MASTER EN ARTES DIGITALES
Midi
1. Librerías
2. Serial y Midi
3. Parsing
4. ProMidi
5. Ejemplos
6. Práctica
Las librerías son conjuntos de métodos que amplían las capacidades de un lenguaje. En el caso de Processing, existen ya más de cincuenta, la gran mayoría de las cuales son contribuciones de personas externas al proyecto. Otras, las llamadas "Core Libraries", son responsabilidad directa de los programadores de Processing, lo cual ofrece mayores garantías de cara a us correcto funcionamento y, sobretodo, mantenimiento y actualización según vayan apareciendo nuevas versiones de Processing.
Las librerías de processing son el recurso al que hay que acudir cuando se quiren expander las funcionalidades básicas del programa.
La lista completa de librerías está aquí: http://processing.org/reference/libraries/index.html
La comunicación en serie es una de las formas más utilizadas y efectivas de comunicación entre ordenadores y microcontroladores. En la página de Jose Lozano hay una buena expliación sobre la comunicación en serie. Se basa en el envío de datos de un dispositivo a otro en forma normalmente de byte, constituidos de ocho bits de información (envíos de 0V o 5V a determinada velocidad).
Hasta no hace tanto tiempo, todos los ordenadores venían con un puerto de serie que servia para comunicarse con dispositivos externos.
El MIDI, por su lado, es un tipo de comunicación en serie, que tiene sus propias especificidades.
Pero antes de entrar en el tema del midi, vamos a ver una práctica muy útil para la comunicación en serie, que de hecho el Midi utiliza implícitamente: el parsing.
Esta técnica consiste en separar (para luego procesar) mensajes que contienen varias informaciones. Ésto tienen sentido en el contexto de una comunicación en serie, donde nos puede interesar mandar un solo mensaje con varias informaciones, más que mandar todas estas informaciones en mensajes distintos (por ejemplo los estados de una serie de botones y potenciómetros que tenemos conectados a un Arduino.
Veremos quatro ejemplos. El primer ejemplo de parsing realiza lo que podríamos llamar un parsing manual, y servirá para entender qué es exactamente esta técnica.
//declaramos un STRING donde haya UN asterisco
String testString = "2389*324";//podría ser "20980*3243", slj*e9ed", etc...
/*declaramos dos strings más que contendrán las 2 partes resultantes
y los inicializamos vacíos */
String partU="";
String partDos="";
//y un booleano para saber en todo momento si ya encontramos o no el carácter
boolean foundAnAsterisc = false;
//creamos un loop para recorrer uno a uno los carácteres del STRING:
for(int i=0;i<testString.length();i++){
//cogemos cada carácter...
char c = testString.charAt(i);
//y lo comparamos con el carácter clave
if(c=='*'){
//si lo es, cambiamos el booleano de control
foundAnAsterisc = true;
}
/*si no, colocamos el carácter en el primer o segundo STRING,
según hayamos encontrado o no el asterisco*/
else if(!foundAnAsterisc){
partU += c;
} else {
partDos += c; }
}
//I finalmente visualizamos el resultado en la consola
println("String Original: "+testString);
println("Primera parte: "+partU);
println("Segunda parte: "+partDos);
El segundo ejemplo utiliza ya la función indexOf() que de hecho es própia de Java, pero que se puede utilizar sin problemas en processing.
//declaramos un STRING donde haya UN asterisco
String testString = "2389*324";//podria ser "298*33", "fkj*fw9d", etc...
/*declaramos dos strings más que contendrán las 2 partes resultantes y
los inicializamos vacíos*/
String partU="";
String partDos="";
//utilizamos String.indexOf() para saber donde está el asterisco:
int keyChar = testString.indexOf('*');
//y partimos el String inicial con el método String.substring():
//del primer carácter al que está en el índice del asterisco
partU = testString.substring(0,keyChar);
partDos = testString.substring(keyChar+1);
//del índice del asterisco al final
//I finalmente visualizamos el resultado en la consola
println("String Original: "+testString);
println("Primera parte: "+partU);
println("Segunda parte: "+partDos);
Finalmente, el tercero y cuarto utilizan una función específica de Processing pensada para esta técnica: split. Veremos primero un ejemplo simple:
//declaramos un STRING con grupos de números separados por UN asterisco String testString = "2389*324*209800*324423*43321"; //declaramos un array al que le asignaremos directamente todas estas partes String numeritos[] = split(testString, '*'); //y visualizamos en la consola: for(int i=0; i " + numeritos[i]); }
Y para acabar un ejemplo complejo de parsing con Split, que podríamos utilizar junto con un programa que nos manda identificadores de elementos del hardware que tenemos conectado al microcontrolador y sus valores:
/*declaramos un STRING donde haya grupos de números separados por UN asterisco, separados a la vez por comas */ String testString = "01*324*54654,02*209,03*324423,04*324423*432*2315"; /*declaramos un array al que le asignaremos directamente todas estas partes separadas por comas*/ String datos[] = split(testString, ','); //y por cada parte de este string repetimos el proceso for(int i=0; i " + numeritos[j]); } }
4.- ProMidi
La librería ProMidi, desarrollada por Christian Riekoff, es un conjunto de métodos que nos permite comunicarnos con todo tipo de dispositivos mediante este protocolo.
Para instalarla, simplemente hay que bajar la última versión (o la que se quiera utilitzar -En nuestro caso utilizaremos la versión 2.0-) de la librería, descomprimirla y copiarlo todo (la misma carpeta "promidi") dentro de la carpeta "libraries" de processing, que se encontará donde tengamos descomprimido el programa (p.e. C:\Archivos de programa\processing-0135\libraries, C:\processing-0135\libraries, etc.).
Una vez hecho esto, podemos importar la librería con el menú de Processing:
´
Si nos aparece la opción "promidi" en este menú, significa que la hemos instalado correctamente.
Para utilizarla, podéis empezar por los ejemplos que siguen, y la referencia y ejemplos que hay en la misma web de la librería ProMidi.
En nuestro caso, y en general, antes de ver ejemplos con código, hay que comprobar que los dispositivos midi están correctamente conectados. Con esta librería, lo podemos hacer con el ejemplo midiSetupBásico, que consta básicamente del código siguiente (comentado):
import promidi.*;
MidiIO midiIO;
void inicializarMidi(){
midiIO = MidiIO.getInstance(this);
println("dispositivos midi disponibles: ");
midiIO.printInputDevices();
Si esto funciona, el siguiente paso es ver si estamos recibiendo lo que esperábamos de Arduino. Antes, si queréis (o después si se detectan problemas), podéis utilizar este código para ver si se recibe alguna nota.
Finalmente, antes de programar algo visual, nos queda comprobar que recibimos todo lo que queremos: el botón, la photocell y el potenciómetro, y que nos da los números esperados. Para este podéis utilizar el ejemplo midiSetupArduino.zip (y en .pde).
5.- Ejemplos
Una vez recibimos los números que queríamos, no queda más que utilizarlos para alguna aplicación. Así, con una de nuestras pelotitas, podemos utilizar el potenciómetro para controlar su velocidad, el photocell para el tamaño y el botón para cambiar colores.
velX = velY = potenciometer / 15;
sz = photocell*4;
Otra opción, con un ejemplo más complejo, es utilizar el hardware que hemos preparado para controlar la gravedad del entorno en el que se mueve la bola (con el potenciómetro), y programar el botón para darle un golpe y volver a hacerla saltar cuando se quedó pegada al suelo.
6.- Práctica
Una vez hemos visto como conectar el midi y como utilizarlo para un par de aplicaciones, podéis imaginar que se puede utilizar una interfaz física para qualiquier aplicación. Así, como práctica, por qué no utilizarla para controlar una versión simplificada de Space Invaders (que puede evolucionar luego a una de todo lo compleja que uno quieral).
Estra práctica consiste pues en modificar el applet que sigue para poder mover vuestra nave con el potenciómetro, disparar con el botón, y reiniciar el juego con la photocell.
(spaceInvaders.zip: código+gifs)
Nota: el potenciómetro da un valor entre 0 y 127. Para mapear esto con el movimiento de la nave, una opción senzilla es la siguiente: 0-42 corresponde a ir haci la izquierda; 43-85 está quieto; 86-127 se mueve para la derecha. Otra opción más compleja y atractiva es hacer el espacio de no movimiento menor y tener distintas velocidades para moverse para los lados según se esté más o menos cerca de este centro.
-- Estos apuntes son el complemento de una clase al Máster de Artes Digitales de la UPF. No estan pues diseñados para consituir un tutorial completo y coherente por si mismos --