Paso 3: Configuración y conseguir inteligente
Si escribes bastantes bocetos de procesamiento que dependen algunos ajustes iniciales que necesita ajustar para diferentes ejecuciones es probable hacer lo que hice y funcionan de cierta manera para cargar dicha configuración desde un archivo de configuración. Sospecho que este es el tipo de codificación que cae en la categoría de "¿Qué tan difícil puede ser?" ya que no creo que molestaba incluso a buscar una solución existente. En cambio hice algo muy sencillo y había ajustado con el tiempo.
Mi primera clase de configuración cargado un archivo de texto de los datos / carpeta y el nombre analizado: valor cadenas en un HashMap. Trabajó muy bien para la mayoría de las cosas. Grandes en las entradas solo elemento simple, pero no tan bueno si desea definir una lista de valores.
Llegué a saber si podría utilizar YAML o JSON para que un archivo de texto podría representar estructuras más complejas. Resulta que el proceso te da JSON incorporado manejo. Perfecto.
Para el bosquejo de MIDI se actualizó la configuración para utilizar JSON. Carga un archivo JSON y obtener los valores sobre todo es fácil pero no totalmente transparente. Usted puede conseguir en diferentes tipos de datos usando getInt, getString, getFloat, etc., pero si quieres agarrar una lista de artículos necesita getJSONArray y entonces necesita sacar cada elemento como el tipo correcto.
Para esta configuración he decidido que en la mayoría de los casos será cualquier lista de elementos del mismo tipo. Así que añadido getStrings, getFloats y getInts.
Ahora en vez de poner los índices de dispositivos en mi bosquejo podría utilizar un archivo de configuración. JSON no es tan simple como nombre: valor, pero no está demasiado lejos de eso. Un poco overkill para archivos cortos, muy útiles para datos estructurados más complejos.
Me voy a los detalles en ese código aquí. Puedes leer más sobre ello aquí.
Ese primer esbozo de la demostración demostró una forma de crear un objeto MidiBus. Hay otra manera, y no sólo es más amigable pero se presta a la mejor configuración. MidiBus permite especificar qué dispositivos a utilizar por su nombre. El nombre tiene que coincidir en lo que se muestra en la lista de dispositivos disponibles, que tal vez necesite ejecutar primero MidiBus.list para ver lo que está ahí.
Una vez que sabes los nombres de las cosas el archivo de configuración puede usar texto legible en lugar de números crípticos.
También puede pasar un nombre para el bus para que después, cuando se invoca a midiMessage, su código puede (si quieres) se comportan forma diferente según el origen del mensaje.
Ahora el bosquejo de la versión parcial de programa (menos el código de Configgy.pde) tiene este aspecto:
import java.lang.reflect.Method; import themidibus.*; import javax.sound.midi.MidiMessage; Configgy config; int currentColor = 0; ArrayList devices = new ArrayList(); void setup() { size(480, 320); config = new Configgy("config.jsi"); String[] deviceNames = config.getStrings("devices"); println("Unavailable Devices"); println( join(MidiBus.unavailableDevices(), "\n")); println("-----------------------------------------------------"); String[] available_inputs = MidiBus.availableInputs(); for (int i = 0;i < available_inputs.length;i++) { for(int x=0; x < deviceNames.length; x++) { println("Check for device " + deviceNames[x] + " against " + available_inputs[i] ); if (available_inputs[i].indexOf(deviceNames[x]) > -1 ) { println("* * * * Add device " + deviceNames[x] + " * * * * "); devices.add( new MidiBus(this, deviceNames[x], 1, deviceNames[x]) ); } } } if (devices.size() < 1 ) { println("Failed to assign any of the desired devices.\nExiting."); exit(); } } void draw() { background(currentColor); } void midiMessage(MidiMessage message, long timestamp, String bus_name) { int note = (int)(message.getMessage()[1] & 0xFF) ; int vel = (int)(message.getMessage()[2] & 0xFF); println("Bus " + bus_name + ": Note "+ note + ", vel " + vel); if (vel > 0 ) { currentColor = vel*2; } }
El archivo config.jsi (en los datos / carpeta) es este:
devices:["QuNexus", "01. Internal MIDI"]
Tendrás que ajustarlo a lo que tienes disponible para utilizar los dispositivos.
Cuando se ejecuta el dibujo, se cargará su archivo de configuración y el código intentará llenar un ArrayList con instancias MidiBus basadas en los nombres de dispositivo proporcionado.
Tenga en cuenta que en este ejemplo el uso de una lista de matrices: el código no es molestando con las variables de instancia específicas para cada instancia de microbús; Este código no siempre hacer referencia a esas instancias.
El controlador de eventos midiMessage se llama no importa cuál de estos dispositivos está enviando el mensaje. El controlador se pasa el nombre de autobús así que usted puede, si lo desea, tiene el código de tomar diferentes medidas dependiendo de la fuente del mensaje MIDI.
Si te estás preguntando por qué molestarse agregar los casos de autobuses a una lista si nunca van a ser utilizados, la razón es que, sin algún tipo de asignación persistente los casos desaparecerá una vez que ha completado la instalación. Una vez que se han ido, ya no será llamado al controlador de eventos de mensaje MIDI.
Si usted quería el código para hacer referencia a cualquiera de estos casos podría considerar usar un HashMap para sostenerlas para que pudiera recuperar dispositivos específicos por nombre.