Question

Je suis à la recherche en faisant un logiciel qui rend la fonction du clavier comme un piano (par exemple, l'utilisateur appuie sur la touche « W » et les haut-parleurs jouent une note D). Je vais probablement utiliser OpenAL. Je comprends les bases de l'audio numérique, mais la lecture audio en temps réel en réponse aux pressions sur les touches pose quelques problèmes que je vais avoir la résolution de problèmes.

Voici le problème: Disons que j'ai 10 tampons audio, et chaque tampon stocke une seconde de données audio. Si je dois remplir des tampons avant qu'ils ne soient lus par les enceintes, alors je serais tampon remplissais une ou deux secondes avant d'être jouées. Cela signifie que chaque fois que l'utilisateur tente de jouer une note, il y aura une ou deux secondes de retard entre la touche et la note jouée.

Comment contourner ce problème? Avez-vous juste faire les tampons aussi petits que possible, et de les remplir le plus tard possible? Y at-il un truc que je suis absent?

Était-ce utile?

La solution

La plupart des synthétiseurs logiciels n'utilisent pas du tout plusieurs tampons.

Ils utilisent juste un seul petit ringbuffer qui est constamment joué.

Un fil de haute priorité sera aussi souvent que possible vérifier le jeu-position actuelle et remplir la partie libre (par exemple, la partie qui a été joué depuis la dernière fois que votre fil est en cours d'exécution) du ringbuffer avec des données sonores.

Cela vous donnera une latence constante qui n'est lié par la taille de votre mémoire tampon en anneau et le temps d'attente de sortie de votre carte son (généralement pas beaucoup).

Vous pouvez réduire encore plus votre temps d'attente:

Dans le cas d'une nouvelle note à jouer (par exemple, l'utilisateur vient d'appuyer sur une touche) vous vérifiez la position de lecture actuelle dans la mémoire tampon en anneau, ajouter quelques échantillons pour la sécurité, puis re-rendre les données sonores avec le nouveaux sonores réglages qui seront appliqués.

Cela devient délicat si vous avez des effets basés sur le temps de fonctionnement (lignes à retard, réverbération et ainsi de suite), mais il est faisable. Il suffit de garder la trace des 10 derniers états de vos effets à base de temps chaque millième de seconde ou plus. Et elle permet de revenir à 10 millisecondes dans le temps.

Autres conseils

Avec le WinAPI, vous ne pouvez obtenir jusqu'à présent en termes de latence. En général, vous ne pouvez pas descendre en dessous de 40-50ms qui est assez désagréable. La solution consiste à mettre en œuvre ASIO dans votre application, et faire de l'utilisateur exécuter quelque chose comme Asio4All en arrière-plan. Cela amène le temps de latence jusqu'à 5 ms, mais à un coût. Autres applications ne peuvent pas jouer son en même temps

Je sais cela parce que je suis un utilisateur FL Studio.

La solution est de petits tampons, souvent remplis par un fil en temps réel. Quelle est la taille que vous faites les tampons (ou de remplissage vous laissez le tampon se avec un anneau tampon) est limitée par la latence d'ordonnancement de votre système d'exploitation. Vous trouverez probablement 10ms acceptable.

Il y a quelques trucs désagréables dans ici pour les non-initiés - notamment en ce qui concerne l'architecture logicielle et la sécurité des threads.

Vous pouvez essayer d'avoir un regard sur Juce - qui est un cadre multi-plateforme pour l'écriture de logiciels audio , et en particulier - plugins audio tels que des effets et du lancement des synthés. Il comprend un logiciel pour les plug-ins échantillon et les hôtes. Il est dans l'hôte que les problèmes avec filetage sont le plus souvent traitées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top