CoreMIDI: une synchronisation midi solide

J’ai des problèmes avec la synchronisation midi. Après les publications dans le site abstractbits.com, j’utilise une classe PGMidi. La synchronisation fonctionne, mais passe constamment à 1-2 bpm.

Voici le code que j’utilise:

- (void)sendMidiClockInMidiThread { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [lock lock]; const int64_t kOneMillion = 1000 * 1000; const UInt8 tick[] = { 0xF8 }; // Calculate tick time // returns sample for sixteen note (5512 if current bpm is 120) SInt32 sixteen = AGGetSamples_SixteensWithoutSwing(_grid, 1.0); UInt64 tickTime = (sixteen / 6) * kOneMillion; int tickLatency = 0; // Send ticks messages for (int i = 0; i < 6; ++i) { int beginTime = clock(); hostTime = hostTime + (tickTime - tickLatency); [self.midi sendBytes:tick size:sizeof(tick) atTime:hostTime]; int endTime = clock(); tickLatency = endTime - beginTime; } [lock unlock]; [pool drain]; } 

S’il vous plaît dites-moi comment obtenir une synchronisation claire.

D’abord: d’où provient ce message? Quelle est votre timer? Vous devez vous assurer que vous utilisez une timer très précise. Vous aurez essentiellement besoin de quelque chose de plus court que 10 ms (20ms correspond à la période de l’impulsion d’horloge MIDI, à 24 impulsions par noire, 120 notes par minute).

Ce gars a écrit assez bien sur les primitives de synchronisation disponibles sur iOS / MacOS.

Son pire cas ici (qui implique le blocage en rotation) est toujours éteint de près de 50 ms dans le pire des cas, et de 14 ms dans le cas moyen. C’est un timing absolument terrible pour le MIDI. Votre meilleur choix est de démarrer un fil de discussion CoreAudio (ou un fil de discussion en temps réel utilisant les informations disponibles ici ).