Bonsoir,
Je traite des évènements midis.
Un évènement midi, c'est :
- un état {Début de la note, fin de la note}
- une hauteur de note {0.. 127}
- une vélocité {0.. 127}
enfin moi là j'ai besoin que de ça.
Donc, comme c'est de la polyphonie, j'ai besoin d'associer une vélocité à chaque note commencée, puis de la virer quand la note se termine, et au début j'avais pensé à une HashMap (avec comme clé la hauteur de note bien sur).
Pour enregistrer mes vélocités je fais comme ça :
Code :
- switch (s) {
- case VSTEvent.VST_EVENT_MIDI_ATTACK:
- voices.put(String.valueOf(note),new MIDINote(note,velo));
- break;
- case VSTEvent.VST_EVENT_MIDI_RELEASE:
- voices.remove(String.valueOf(note));
- }
|
Alors, ça marche.
Mais ce qui me dérange, c'est de devoir mettre 2 fois la hauteur de note, en effet, j'ai besoin au moment de la synthèse du son de parcourir tous les éléments de la HashMap. Je récupère donc sa collection, que je transforme en Array :
Code :
- int nvoi=Math.min(voices.size(),MAX_POLYPHONY);
- Object[] notes=voices.values().toArray();
- for(int i=0; i<nvoi; ++i){
- baseFreqs[i]=FREQ_TABLE[((MIDINote)notes[i]).note]*fScaler;
- }
|
Si j'ai besoin de stocker un objet MIDINote (constitué d'une hauteur de note et d'une vélocité) dans ma HashMap avec cette technique, c'est parce qu'au moment de la parcourir, je n'ai pas la clé (la hauteur de note) et j'en ai absolument besoin.
Moi au final, je m'en fous de ma MIDINote, j'aimerais pouvoir n'associer qu'une valeur à une autre valeur, tout en étant capable de parcourir de manière itérative tous ces éléments, et en récupérer à la fois la clé et la valeur.
Je n'ai pas beaucoup d'expérience en java, et je ne sais pas si c'est une bonne idée de passer les clés en chaînes de caractères, sachant qu'en 1.4, on ne peut pas passer de type primitif.
Voilà, j'espère que c'est pas trop embrouillé, et merci d'avance