Bon...Après avoir essayé diverses techniques de dither, je dois bien me rendre compte que ma stratégie (avoir les instruments déjà convertis en bit-stream en mémoire) ne marche pas à 100%. La cause: la vitesse de sortie sur le buzzer. Je suis monté à presque 8khz et c'est pas tellement mieux. En fait ca s'explique: les routines dither de type sigma-delta ne marchent que si on sur-échantillonne le flux d'origine. Or nous on fait exactement l'inverse: on joue 1 bit à 8khz pour un son 8bits de 8khz. Ma stratégie fonctionnerait si la routine tournait à 100khz (en fait 64khz pour conserver le produit
nb_bits_échantillons*vitesse_d_échantillonnage constant, mais 100 c'est plus rond) ou plus mais à 8khz on est sans doute trop bas pour capturer toutes la finesse du sigma-delta. Hélas 100khz est largement au dessus de la vitesse du 6809: il faudrait traiter les 4 voix en moins de 10 cycles, sans compter qu'à cette vitesse un instrument de 2 secondes occupe 200kbits de ram, soit 200ko de ram contiguës à trouver!!
Bizarrement le dither audio a besoin de nettement sur-échantillonner par rapport au dither graphique. En effet avec 1 bit/pixel on arrive parfaitement à reconnaître une image N&B, alors qu'avec 1 bit par échantillon musical ca ne marche pas du tout. Il faut avoir au moins 10x plus d'échantillons 1 bit que d'échantillons d'origine. Je ne comprends pas bien le pourquoi d'une telle différence entre les deux disciplines.
Est-ce que c'est parce que les images sont moins périodiques et qu'il n'y a pas de repliement de spectre? Mystère. Si quelqu'un a une idée là dessus je suis preneur pour ma compréhension personnelle du phénomène. Enfin bref, une chose est claire à présent: si on veut de la qualité à tous les coups, il faut forcément sur-échantillonner la musique.
Pourtant le code de UTZ ne tourne pas aussi vite que quelque khz et son dither marche vraiment. Comment ca se fait ?
Reprenons ce qu'il fait. Les échantillons sont numériques en mémoire et pas bit-streamés. Il réalise alors dessus du PWM à 9khz. Une période complète de PWM est donc de 110µs, mais elle est découpée en 21 tranches de 5µs correspondantes aux 21 niveaux de son PWM. Ansi, pour chaque échantillon source il y a 21 micro-pas supportant le rapport-cyclique. Donc moralement, il joue du PWM à une fréquence 21 fois plus élevée la fréquence fondamentale, soit 21*9khz=189khz. Son approche équivaut complètement à sur-échantillonner la musique à près de 190khz. C'est largement supérieur à nos pauvres 8khz. C'est ce qui explique la différence de qualité.
Ce qu'il y a de bien avec le PWM, c'est que même si les micro-tranches sont de 5µs, ca ne ralenti pas tellement le player puisque seuls les instants où le buzzer change d'état dans le cycle (2 fois maxi) sont à prendre en compte. Cela revient donc à déplacer les 2 instructions de changement d'état sur 21 positions au travers de la boucle à 9khz. C'est vraiment malin car ca ralenti à peine la boucle principale.
Ok, alors faisons ca pour thomson! Oui mais c'est pas aussi simple car sur ZX la sortie sur le buzzer se fait sans utiliser de registres, alors que ben sur thomson il faut passer par les accumulateurs qui sont déjà occupés à faire quelque chose.
Il n'y a qu'entre deux phases de calculs indépendants que l'on peut détourner un accu pour changer le bit du buzzer. Ca ne fait pas beaucoup d'endroits.
En analysant le code j'arrive à trouver 5 emplacements répartis de façon suffisamment régulière. Ainsi, entre chaque voix et entre la dernière voix et la phase de mixage il y a exactement 27µs (pure coup de bol, mais ca tombe super bien). Ca nous ferait un PWM à 6 niveaux (00000, 10000, 11000, 11100, 11110, 11111) dont chaque pulse 0 ou 1 dure 27µs, soit un sur-échantillonnage à ~37khz ce qui est clairement mieux que nos malheureux 8khz. Mais est-ce suffisant pour avoir quelque chose de qualité ? Je ne sais pas. Il faut expérimenter, et cela nécessite de ré-écrire complètement le player. Il me reste donc plein de travail à faire. J'espère au moins que la qualité sera là car ca m’ennuierait de tout détruire pour ne pas avoir beaucoup mieux au final.
En y réfléchissant, 6 niveaux ca fait pas beaucoup, non? On est encore loin des 21 niveaux à 190khz de la routine de UTZ. J'ai simulé ces 6 niveaux avec le player CNA.. vous en pensez quoi ? (moi: bof bof.)
Fichier(s) joint(s):
Commentaire: Test de sortie CNA avec seulement 6 intensités sonnores.
test_6_niveaux.zip [247.22 Kio]
Téléchargé 711 fois
Si seulement on pouvait altérer le buzzer sans passer par les accumulateurs....
([EDIT] Tip de Fool-duplex qui a perdu son mot de passe:
sur MO5 on peut changer le buzzer par un simple inc/dec sur $A7C0)
[EDIT] Ah! Avec un peu d'astuce, il y aurait possibilité de booster le PWM de 6 à 11 niveaux. Là je suis plus confiant pour la qualité.