Étape 8: Quel est ce canal ?
Étant donné que le tirage au sort ne fait pas beaucoup l’action réelle doit être le cas ailleurs. En effet, c’est les méthodes de gestion note qui animent ce qui est vu. Quand un message MIDI arrive il obtient expédié à un gestionnaire de note correspondant s’il en existe. J’ai décidé que je voulais être en mesure de générer des modèles, tels que remplir une grille de 4 x 4 avec images note par note. J’ai écrit un gestionnaire remarque qui fait ceci pour le côté gauche de la fenêtre de dessin et pensé qu’il serait bien de faire la même chose du côté droit, mais inversé.
Dans un premier temps je l’ai fait en utilisant deux gestionnaires de note différente, pensant que j’utiliserais une octave pour les choses se passent sur le côté gauche et une autre octave pour le droit. Cela se sentait maladroit. Pourquoi ne pas impliquer canaux ?
MidiBus fournit des gestionnaires d’événements supplémentaires, y compris noteOn, qui, si vous la définissez, est appelée lorsque n’importe quel appareil reçoit un un message. Cette méthode vous donnera le canal, la valeur de note et la vitesse. Toutefois, il ne vous donne pas le nom de l’autobus de MIDI qui l’a reçu.
À ce stade dans le développement, je n’avais pas un plan clair pour l’utilisation du nom de bus mais quelques idées sont formaient et je ne voulais pas laisser tomber la possibilité de l’utiliser. Mais je voulais le canal, trop.
midiMessage est appelée avec certaines données spécifiques remises droit à vous (par exemple le nom de bus), mais le message lui-même est quelque peu énigmatique. Vous avez peut-être remarqué il y a des mathématiques intéressantes passe pour obtenir les valeurs de note et de la vitesse.
int note = (int)(message.getMessage()[1] & 0xFF) ;
Un message MIDI est assez compact. Elle est envoyée sous forme d’une série d’octets. Je vais d’ignorer les détails techniques, mais pour obtenir la valeur utile de ces octets en Java, vous devez saisir un paragraphe d’eux et ensuite appliquer un « masque ». Ce masque force une partie de la valeur d’assumer une certaine valeur, ce qui nous donne un résultat utile.
Le code faisait cela pour obtenir les valeurs de note et de la vitesse. Ils ont même approche peut être utilisée pour obtenir la chaîne aussi bien. midiMessage deviendrait alors ceci :
void midiMessage (message de MidiMessage, long timestamp, String bus_name) {int canal = (int)(message.getMessage() [0] & 0x0F) + 1 ; void midiMessage(MidiMessage message, long timestamp, String bus_name) { int channel = (int)(message.getMessage()[0] & 0x0F) + 1; int note = (int)(message.getMessage()[1] & 0xFF) ; int vel = (int)(message.getMessage()[2] & 0xFF); invokeNoteHandler(note, vel, channel, bus_name); }
invokeNoteHandler doit maintenant faire une recherche de méthode avec trois arguments :
void invokeNoteHandler(int note, int velocity, int channel, String bus_name) { try { Class[] cls = new Class[3]; cls[0] = int.class; cls[1] = int.class; cls[2] = String.class; Method handler = this.getClass().getMethod( "onNote" + note, cls ); handler.invoke(this, velocity, channel, bus_name); } catch (Exception e) { println("* * * * * * Error handling note " + note + " * * * * * * "); e.printStackTrace(); } }
Avec le nom de canal et de bus disponible chaque gestionnaire Remarque peut comportement différemment selon la source de la note. Dans certains cas cela rend plus facile d’organiser les notes au point d’origine. Par exemple, j’ai créé une méthode qui pourrait continuer à ajouter une image à 4x4 grille, suivi d’un index de grille. Si l’index est hors des limites (c'est-à-dire inférieure à 0 ou supérieure à 15, dépend de la direction dans laquelle a été utilisé pour remplir la grille) la grille serait déboisée.
J’ai cela a affecté la C4 (c.-à-d. note 48). Avant de porter des chaînes dans le code, j’ai eu C64 déclencher ce comportement sur le côté gauche de l’esquisse et C5 utilisé pour la déclencher à droite (où il irait dans le sens inverse, à partir de l’emplacement de la grille 15). Mais je n’étais pas heureux avec cette utilisation des octaves. Décider d’ajouter des canaux j’ai créé un autre instrument MIDI-déclencheur dans Renoise et réglez-le à la sortie sur le canal 2. De cette façon je pourrais mettre en place chaque note pour mapper à un comportement spécifique, avec le canal de déterminer de quel côté de l’écran, il semblerait.
Ce genre d’organiser les décisions sont très subjectif. Cela fonctionne pour moi (donc loin, peut-être après une utilisation plus que je vais travailler sur un autre régime). Le point est qu’il n’y a pas une seule vraie façon de le faire ; trouver une approche qui fonctionne pour vous.
Voici comment onNote48 fini après cette modification :
void onNote48(int vel, int channel, String bus_name) { if (vel > 0) { switch(channel) { case 1: addToGridL4x4(); break; case 2: addToGridR4x4(); break; } } }
addToGridL4x4() est la suivante :
void addToGridL4x4() { if (gridL4x4Pointer < 0) { renderL.clear(); gridL4x4Pointer = 15; } renderL.add(new RenderArgs( nextTint(), gifs[nextGifIndex()], 4, 4, gridL4x4Pointer) ); gridL4x4Pointer--; }
Le régime général est l’utilisation d’une variable pour suivre un index dans une grille, mise à jour de l’index, et en s’assurant qu’il a toujours une valeur valide.
À un moment donné, les variables globales doivent s’en aller et tout cela est enveloppé dans une classe, mais la mutabilité lâche se prête au comportement intéressant.