Le truc à voir avec le PWM, c'est qu'il coute très peu de cycles.
Regardons un PWM à 9 niveaux. Cela revient à choisir 8 états successifs pour le buzzer: 00000000, 10000000, 11000000,11100000, 11110000, 11111000, 11111100, 11111110, 11111111. Alors oui écrire dans le buzzer 8 fois pour ces 8 états coute beaucoup de temps CPU. Mais on peut être plus malin en n'écrivant pas les valeurs 1 et 0 à chaque fois, mais uniquement lors des transitions 1->0 ou 0->1. Ca veut dire qu'au lieu d'écrire 8 fois dans le buzzer, on écrit plus que 2 fois: 00------, 10------, 1-0------, 1--0----, 1---0---, 1----0--, 1-----0-, 1------0, 1-------1. Ca va 4 fois plus vite!
Au final, on perd très peu de cycles et cela ralenti à peine la vitesse de lecture initiale. On continue à lire la carte SD à 5khz, mais on arrive à faire un PWM 9 niveaux capable de changer d'état tous les 8*5=40khz. On a multiplié la vitesse par 8 (virtuellement). C'est ca le grand truc que j'utilise dans mon exercice de style sur le buzzer.
A noter qu'en changeant l'endroit des transitions 1->0 ou 0->1, on arrive facilement à envoyer la porteuse initiale sur sa fréquence double: 00--00--, 10--00--, 10--10--, 1-0-10-, 1-0-1-0, 1--01-0-, 1--01--0, 1--11--0, 1--11--1 (c'est à dire les motifs 00000000, 10000000, 10001000, 11001000, 11001100, 11101100, 11101110, 11111110, 111111111). Je viens de tester avec mon player et ca marche très très bien. (ne faites pas attention à l'erreur de typo)

- porteuse 9khz.gif (357.38 Kio) Vu 507 fois
La porteuse est à présent à 9khz: on l'entends beaucoup moins! Je dirais même que je ne l'entends plus sur mon CRT car elle est couverte par le sifflement naturel du moniteur

Mais par contre on a 4 changements d'état par cycle total. Le player est un peu ralenti à 4.6khz. Mais ca ne semble pas nuire à la qualité obtenue.
Je suis content

car je pense avoir bien compris comment maitriser la porteuse quand on joue du PWM à fréquence basse: la théorie ci-dessus colle à la pratique

Du coup, si on avait un chouia de puissance en plus pour changer l'état du buzzer pour chaque top interne, on pourrait utiliser des motifs aléaloires de 1 et 0 présentant la bonne densité de 1 ce qui casserait la régularité du cycle, et donc la porteuse. Par exemple avec le niveau 50% on utilise par défaut 11110000, mais on pourrait utiliser 10101010 ce qui enverrait la porteuse à une fréquence 4 fois plus élevée dans le spectre. Le player à 5khz se retrouve grace au 2e motif avec une porteuse de 20khz, donc grandement atténuée.