Étape 3: Configuration et obtenant intelligent
Si vous écrivez suffisamment croquis de traitement qui dépendent des paramètres initiaux que vous devrez régler pour les différentes exécutions, vous êtes susceptible de faire ce que j’ai fait et travailler sur un moyen de charger ces paramètres depuis un fichier de configuration. Je soupçonne que c’est le genre de codage qui tombe dans la catégorie « comment dur est-il possible? » car je ne pense pas que j’ai même pris la peine de chercher une solution existante. Au lieu de cela, j’ai fait quelque chose de vraiment simple et ajusté au fil du temps.
Mon premier cours de Config a chargé un fichier texte de données / dossier et nom : valeur analysée cordes dans une table de hachage. Cela a fonctionné assez bien pour la plupart. Idéal pour les entrées unitaire simples, mais pas très bon si vous voulez définir une liste de valeurs.
Je dois me demandais si je pouvais utiliser YAML ou JSON afin qu’un fichier texte pourrait représenter des structures plus complexes. S’avère que traitement vous donne JSON intégré de manutention. Parfait.
Pour le croquis de MIDI la configuration a été mise à jour pour utiliser JSON. Chargement d’un fichier JSON et d’obtenir les valeurs sont surtout facile, mais pas tout à fait transparente. Vous pouvez obtenir à différents types de données à l’aide de getInt, getFloat, getString, etc, mais si vous souhaitez récupérer une liste d’éléments vous avez besoin getJSONArray et puis il faut tirer sur chaque élément dans le type approprié.
Pour cette Config, j’ai décidé que dans la plupart des cas, une liste d’éléments sera du même type. J’ai donc ajouté getStrings, getFloats et getInts.
Maintenant, au lieu de mettre les indices périphériques dans mon croquis, je pourrais utiliser un fichier de configuration. JSON n’est pas aussi simple que de nom : valeur, mais il n’est pas trop loin de celui. Un peu exagéré pour fichiers courts, très pratiques pour les données structurées plus complexes.
Je n’obtiendrai pas dans les détails sur ce code ici. Vous pouvez en savoir plus à ce sujet ici.
Cette première esquisse de démonstration a montré comment créer un objet de MidiBus. Il y a une autre façon, et il n’est pas seulement plus convivial mais se prête à la meilleure configuration. MidiBus vous permet de spécifier quels appareils utiliser par nom. Le nom doit correspondre à ce qui est affiché dans la liste des périphériques disponibles, vous devrez peut-être d’abord exécuter MidiBus.list pour voir ce qu’il y a.
Une fois que vous connaissez les noms des éléments du fichier de configuration pouvez utiliser texte lisible au lieu de nombres cryptés.
Vous pouvez également transmettre un nom pour le bus afin que plus tard, lorsque midiMessage est appelé, votre code peut (si vous le souhaitez) se comportent différemment suivant la source du message.
Maintenant, l’esquisse de la démo (moins le code pour Configgy.pde) ressemble à ceci :
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; } }
Le fichier config.jsi (stockées dans les données / dossier) est la suivante :
devices:["QuNexus", "01. Internal MIDI"]
Vous devrez régler cela à quelque appareils dont vous disposez à utiliser.
Lorsque vous exécutez l’esquisse, votre fichier de configuration sera chargé et le code tentera d’y transférer un ArrayList MidiBus instances basées sur les noms de périphérique vous avez fourni.
Notez que, dans cet exemple, l’utilisation d’un ArrayList, signifie que le code n’est pas déranger avec des variables d’instance spécifiques pour chaque instance de MidiBus ; Ce code ne jamais faire référence à ces instances.
Le gestionnaire d’événements midiMessage est appelé n’importe lequel de ces appareils est d’envoyer le message. Le nom d’autobus est passée au gestionnaire d’afin que vous puissiez, si vous le souhaitez, avoir le code de prendre des mesures différentes selon la source du message MIDI.
Si vous vous demandez pourquoi s’en faire ajouter les instances de l’autobus à une liste si ils ne vont jamais à utiliser, la raison est que, sans une sorte de cession persistante ces instances disparaîtra une fois l’installation terminée. Une fois qu’ils sont partis, le gestionnaire d’événements de message MIDI est n’est plus appelé.
Si vous ne voulez pas le code pour faire référence à aucun de ces cas alors vous pouvez envisager d’utiliser une table de hachage pour les tenir de sorte que vous pouvez extraire des périphériques spécifiques à nom.