Se ha construido un MidiClock integrado en el propio arduino. Se trata de un sumador que envia 24 mensajes por pulso. Para el calculo del tiempo usamos la siguiente formula:

tempoMicros = int(60000000/(tempo*24.0));

Para que el envío del Clock tenga la máxima prioridad, hemos usado una interrupción del sistema. Cuando cambiamos el modo del clock de externo a interno, se activan los siguientes comandos:

Timer1.initialize(midiProg.tempoMicros);
Timer1.attachInterrupt(funcionInterrupcion); 

Luego, al inicio del loop se inicia lo siguiente:

void funcionInterrupcion() {
  enviarPulso = true; 
}

void loop() {
  if (enviarPulso && midiProg.modeMidiClock == 1) {
    enviarPulso = false; // Bajamos la bandera
    MIDI.sendRealTime(midi::Clock);
    midiProg.clock++;
    midiProg.tipoMsgMidi = 0xF8;
    if(midiProg.clock > 23){midiProg.clock = 0;}
    midiProg.midiSeq();
    midiProg.midiNotesOn();
    midiProg.midiNotesOff();
    return;
  }
  if ((midiProg.tipoMsgMidi == 0xFA || midiProg.tipoMsgMidi == 0xFC) && midiProg.modeMidiClock == 1) {
      midiProg.midiSeq(); 
      midiProg.tipoMsgMidi = 0;
  }

Al inicio del Loop se genera el envío del Clock y de las notas. Tambien eso funciona cuando se quieren enviar las señales de Start y Stop (0xFA y 0xFC).

También, se recomienda para evitar el jitter interno del sistema, reducir el temporizador de latencia en propiedades del USB Serial Port en Administrador de dispositivos:

image.png

El Jitter Actual abarca entre 119.5 y 120.5