Latence du synthétiseur
Une autre considération dans le minutage du synthétiseur est la latence, qui est la différence entre l’heure actuelle et la première fois qu’une note peut lire. Un message MIDI ne peut pas être envoyé au synthétiseur et rendu dans la mémoire tampon de sortie à l’heure d’échantillonnage actuelle. Vous devez prendre en compte les données qui ont déjà été placées dans la mémoire tampon, mais qui n’ont pas encore été diffusées vers le périphérique de sortie d’onde.
Le récepteur d’ondes doit donc implémenter une horloge de latence, qui est un objet IReferenceClock (décrit dans la documentation Microsoft Windows SDK). La méthode IReferenceClock ::GetTime de l’horloge à latence récupère l’exemple d’heure jusqu’à laquelle les données ont déjà été écrites dans la mémoire tampon et la convertit en heure de référence par rapport à l’horloge master. Le récepteur d’ondes effectue des conversions entre l’heure de référence et l’heure d’échantillonnage avec IDirectMusicSynthSink ::SampleToRefTime et IDirectMusicSynthSink ::RefTimeToSample. Dans ce cas, le synthétiseur appelle IDirectMusicSynthSink ::RefTimeToSample pour effectuer la conversion.
Le temps de latence est géré par le récepteur d’ondes. Votre implémentation de la méthode IDirectMusicSynthSink ::GetLatencyClock doit générer un pointeur vers l’horloge de latence, et ce pointeur doit à son tour être récupéré par IDirectMusicSynth ::GetLatencyClock. L’application utilise l’horloge de latence pour déterminer le point le plus tôt dans le temps auquel un message MIDI peut être mis en file d’attente pour être lu lorsqu’il est passé au synthétiseur en appelant la méthode IDirectMusicSynth ::P layBuffer .
La figure suivante montre un exemple de latence d’un message MIDI.
Dans la figure précédente, l’horloge de latence pointe vers la première place dans la boucle de mémoire tampon PCM où une note peut être lue. Notez que l’horloge master est à 22 unités de temps, ce qui est le point à partir duquel le son est actuellement en cours de lecture, mais l’espace entre 22 et 30 unités de temps a déjà été rempli avec des données d’ondes et ne peut plus être écrit dans. Par conséquent, le premier endroit où la lecture d’un nouvel événement MIDI horodaté peut être planifiée est l’heure 30. Ainsi, l’horloge de latence lit 30 unités de temps.
La lecture des messages peut être planifiée à ce moment de latence, ou à tout moment après. Par conséquent, les messages qui doivent être rendus immédiatement sont marqués avec le temps de latence (et non l’heure actuelle) avant d’être placés dans la mémoire tampon d’entrée du synthétiseur.