Partager via


Synchronisation des horloges

Une tâche critique pour le récepteur d’ondes consiste à résoudre la dérive de temps entre l’horloge de référence et les cristaux d’horloge échantillon. Il le fait avec l’équivalent logiciel d’une boucle verrouillée par phase.

Le collecteur d’ondes effectue le suivi du numéro d’échantillon dans la mémoire tampon auquel il peut écrire ensuite. Ainsi, même s’il sait qu’il est activé, par exemple, échantillon 20, le récepteur d’ondes doit toujours vérifier l’horloge principale pour obtenir une heure de référence. Il a un thread qui se réveille environ toutes les 20 millisecondes et demande l'heure actuelle à l'horloge principale. L’horloge principale peut signaler que l’heure actuelle (en millisecondes) est de 420, par exemple.

Le récepteur d’ondes conserve également une horloge de latence, qui indique le décalage entre l’heure actuelle en fonction de l’horloge principale et de l’heure de l’échantillon. Il utilise ces informations pour calculer l’heure de l’horloge principale attendue et la compare à la lecture réelle de l’horloge principale pour voir si les deux horloges s'écartent.

Le puits d'ondes utilise une boucle à verrouillage de phase pour ajuster le temps d'échantillonnage. Lors de la vérification de la dérive, le puits d'ondes n'est pas ajusté de la totalité de la variation, car les relevés contiennent une certaine gigue. Au lieu de cela, il déplace l’exemple d’horloge par une fraction de la distance vers l’horloge principale. De cette manière, le récepteur d'onde atténue les erreurs de gigue tout en restant globalement synchronisé. Il convertit également ce temps en temps d'horloge de latence référencé à l'horloge maître. Cela est important, car l’application peut avoir besoin de savoir où le synthétiseur effectue le rendu à tout moment.

L'horloge de latence indique à l'application l'heure la plus tôt à laquelle une nouvelle note peut être planifiée pour être jouée. L’heure de latence est l’heure de l’horloge principale, ainsi qu’un décalage qui représente la latence du synthétiseur. Cette latence représente le délai minimal entre le moment où l’application envoie une nouvelle note à lire au moment où le synthétiseur lit réellement la note. À tout moment, l’application peut planifier la lecture d’une note à ou après l’heure de l'horloge de latence actuelle, mais pas plus tôt.

Par exemple, si l’horloge principale est actuellement à l’heure 420 et que l’application a une note qu’elle souhaite lire dès que possible, l’horloge de latence indique le moment le plus tôt auquel la note peut être jouée. Si le synthétiseur logiciel présente une latence de 100 millisecondes, la prochaine fois qu’il peut jouer une note est au moment 520.

Supposons qu’un événement soit marqué pour être joué au temps 520 dans le temps de référence. Le synthétiseur effectue son travail en convertissant les notes en échantillons et en effectuant tous ses calculs à l'échelle temporelle des échantillons. Il doit donc savoir à quoi correspond une heure de référence de 520 en heure d'échantillonnage. En mode utilisateur, le récepteur d’ondes fournit deux fonctions que le synthé utilise :

IDirectMusicSynthSink ::SampleToRefTime et IDirectMusicSynthSink ::RefTimeToSample**

Pour effectuer la conversion dans ce cas, le synthé appelle IDirectMusicSynthSink ::RefTimeToSample sur le récepteur d’ondes.

Le récepteur d’ondes renvoie ensuite un échantillon de temps (par exemple, 600). La note en question est rendue au temps d'échantillonnage 600. Ensuite, lorsque la méthode du synthétiseur IDirectMusicSynth::Render est appelée par le convertisseur de flux pour traiter la partie suivante du flux (par exemple, de l'échantillon 600 à 800), la note est rendue dans le tampon à l'échantillon 600.

Note L’heure de l’échantillon est conservée sous la forme d’un nombre 64 bits pour éviter le dépassement. (Une valeur DWORD se réinitialise après 27 heures.)

Pour résumer, le synthé effectue toutes ses calculs internes en temps d'échantillonnage et le convertisseur de signal effectue la conversion en temps d'échantillonnage à partir du temps de référence et vice versa. Le récepteur d’ondes gère également la synchronisation avec l’horloge principale et fournit des informations de latence. Le masquage de cette fonctionnalité dans le récepteur d’ondes facilite l’écriture du synthé.