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:

El Jitter Actual abarca entre 119.5 y 120.5