Partager via


Latence du synthétiseur

Une autre considération du minutage du synthétiseur est la latence, c’est-à-dire la différence entre l'heure actuelle et la première fois qu'une note peut être jouée. Un message MIDI ne peut pas être envoyé au synthétiseur et rendu dans la mémoire tampon de sortie au moment de l’exemple actuel. Une marge doit être prévue pour 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 audio.

Le récepteur d’ondes doit donc implémenter une horloge de latence, qui est un objet IReferenceClock (décrit dans la documentation du Kit de développement logiciel (SDK) Microsoft Windows). La méthode IReferenceClock ::GetTime de l’horloge de latence récupère l’exemple d’heure jusqu’à laquelle les données ont déjà été écrites dans la mémoire tampon et les convertit en heure de référence par rapport à l’horloge principale. Le récepteur d’ondes effectue des conversions entre référence et heure d’échantillonnage avec IDirectMusicSynthSink ::SampleToRefTime et IDirectMusicSynthSink ::RefTimeToSample. Dans ce cas, le synthé appelle IDirectMusicSynthSink ::RefTimeToSample pour accomplir 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 ancien dans le temps auquel un message MIDI peut être mis en file d’attente pour lire lorsqu’il est passé au synthétiseur en appelant la méthode IDirectMusicSynth ::P layBuffer .

Un exemple de latence d’un message MIDI est illustré dans la figure suivante.

Diagramme illustrant la latence d’un message MIDI dans une boucle de mémoire tampon PCM.

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. Veuillez noter que l'horloge principale est à 22 unités de temps, ce qui est le point où 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 de wave et ne peut plus être modifié. Par conséquent, la première place où un nouvel événement MIDI horodaté peut être planifié est à l’heure 30. Ainsi, l’horloge de latence lit 30 unités de temps.

Les messages peuvent être programmés pour être diffusés à ou à tout moment après le temps de latence. Par conséquent, les messages qui doivent être affichés 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.