Synchronisation des horloges
Une tâche essentielle pour le récepteur d’ondes consiste à résoudre la dérive temporelle entre l’horloge de référence et les cristaux d’horloge d’échantillon. Il le fait avec l’équivalent logiciel d’une boucle à verrouillage de phase.
Le récepteur d’ondes effectue le suivi du numéro d’échantillon dans la mémoire tampon dans laquelle il peut écrire ensuite. Ainsi, même s’il sait qu’il est sur, par exemple, l’échantillon 20, le récepteur de vagues doit toujours case activée l’horloge master pour obtenir une heure de référence. Il a un thread qui se réveille environ toutes les 20 millisecondes et demande au master horloge pour l’heure actuelle. L’horloge master 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 affiche le décalage entre l’heure actuelle en fonction de l’horloge master et de l’heure de l’échantillon. Il utilise ces informations pour calculer l’heure d’horloge attendue master et la compare à la lecture d’horloge master réelle pour voir si les deux horloges se sont écartées.
Le récepteur d’ondes utilise une boucle à verrouillage de phase pour ajuster l’heure de l’échantillon. Lors de la vérification de la dérive, le récepteur d’ondes ne s’ajuste pas de la totalité, car les relevés contiennent une certaine gigue. Au lieu de cela, il déplace l’horloge de l’exemple d’une fraction de la distance vers l’horloge master. De cette façon, le récepteur de vague lisser les erreurs de gigue tout en restant approximativement synchronisé. Il prend également ce temps et le convertit en une heure d’horloge de latence qui est relative à l’horloge master. Cela est important, car l’application peut avoir besoin de savoir où le synthétiseur est rendu à tout moment.
L’horloge de latence indique à l’application l’heure la plus précoce à laquelle une nouvelle note peut être planifiée pour la lecture. L’horloge de latence correspond à l’heure d’horloge master plus 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 et le moment où le synthétiseur lit réellement la note. À tout moment, l’application peut planifier la lecture d’une note à ou plus tard, mais pas avant l’heure de latence actuelle.
Par exemple, si l’horloge master est actuellement à l’heure 420 et que l’application a une note qu’elle souhaite lire dès que possible, l’horloge de latence lui indique l’heure la plus précoce à laquelle la note peut être lue. Si le synthétiseur logiciel a une latence de 100 millisecondes, la prochaine fois qu’il pourra lire une note est à l’heure 520.
Supposons qu’un événement soit marqué pour être lu à l’heure 520 à l’heure de référence. Le synthétiseur effectue son travail en rendant les notes dans des exemples et en effectuant tous ses calculs au moment de l’échantillon. Par conséquent, il doit savoir en quoi une heure de référence de 520 se convertit dans l’heure de l’échantillon. 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étiseur 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 moment de l’exemple 600. Ensuite, lorsque la méthode de synthèse IDirectMusicSynth ::Render est appelée par le récepteur d’ondes pour afficher la partie suivante du flux (par exemple, entre l’heure d’échantillonnage 600 et 800), la note est rendue dans la mémoire tampon à l’heure de l’échantillon 600.
Note L’heure de l’échantillon est conservée en tant que nombre 64 bits pour éviter la substitution. (Une valeur DWORD est remplacée dans 27 heures.)
Pour résumer, le synthétiseur effectue toutes ses opérations mathématiques internes au moment de l’échantillon et le récepteur d’ondes effectue la conversion en heure d’échantillonnage à partir de l’heure de référence et vice versa. Le récepteur d’ondes gère également la synchronisation avec l’horloge master et fournit des informations sur la latence. Le masquage de cette fonctionnalité dans le récepteur d’ondes facilite l’écriture du synthé.