Para enviar varias secuencias a la vez, se ha necesitado reestructurar el código para trabajar por objetos y no con variables globales.
Toda la programación se ha editado para poder ser lanzada varias veces por cada secuencia con valores diferentes:
MidiProgramming midiProg[5] = {
MidiProgramming(0),
MidiProgramming(1),
MidiProgramming(2),
MidiProgramming(3),
MidiProgramming(4)
};
MidiProgramming::MidiProgramming(int _id) :
id(_id),
La variable interna id será la que gestione que secuencia se esta ejecutando en cada momento, la cual la enviamos de la siguiente manera:
for(int i = 0; i < N_MAX_SEQUENCES; i++){
midiProg[i].midiSeq();
}
for(int i = 0; i < N_MAX_SEQUENCES; i++){
midiProg[i].midiNotesOn();
midiProg[i].midiNotesOff();
}
Partiendo de las variables que contiene midiPresets.h para cada loop, se han convertido cada una en arrays para cada número de secuencia:
Estas variables son las que definen como es cada una de las secuencias.
Durante la performance, puedes escoger que secuencia estás editando en todo momento mediante una variable que se guarda en midiPresets.h llamada indexSequence. Cada vez que comienza una función, llama a la secuencia en la que estamos actualmente:
void MidiInterface::checkMidiButtons() {
syncWithActiveSequence();
//...
void MidiInterface::syncWithActiveSequence() {
s = presetsUI.getActiveSequence();
stp = menusUI.editExtension ? s->ext_steps : s->steps;
}
Sequence* getActiveSequence(){ return &marcaPasos.nSequence[indexSequence]; }
IndexSequence es la variable que nos indica en que secuencia nos encontramos para editarla
Si quieres saber como funciona este código, puedes verlo con variables más reducidas aquí.