logo

Cette page a au moins 11 ans !
This page is at least 11 years old !
Objectif
A première vue
Le schéma
L'alimentation
Le microcontrôleur
Le synthétiseur
Les ROMs
Code et memory map
Cartouche AVR
Cartouche CPLD
Convertir les sons
Créer le ROM
Circuits imprimés
Le synthétiseur

SimulationLe premier circuit développé pour l'occasion est le TMS5100 (alias TMC0280), un synthétiseur audio qui utilise des données codées en LPC (Linear Predictive Coding). Le datasheet reste introuvable sur le net, le plus proche est celui du TMS5220, son grand frère.

Le codage LPC est encore utilisé de nos jours pour la voix dans des applications ou la bande passante est la principale contrainte, et permet d'atteindre des débits descendant jusqu'à 1.2kbits/s, et ainsi de stocker environ 200 mots dans seulement 32ko.

Pour atteindre un tel débit, le synthétiseur n'utilise pas les données représentant la forme de l'onde sonore (comme un simple fichier wav), mais des blocs de données représentant des trames de 25ms d'audio, contenant seulement les informations nécessaires pour reproduire la voix : l'énergie (amplitude), le pitch (fréquence), et les paramètres d'un filtre numérique d'ordre 10.

Information Énergie (E) Flag répétition (R) Pitch (P) Paramètres du filtre (K1~K4/K10)
Taille (bits) 4 1 5 18 ou 39

Paramètre K1 K2 K3 K4 K5 K6 K7 K8 K9 K10
Taille (bits) 5 5 4 4 4 4 4 3 3 3

Pour produire le son, le synthétiseur dispose de deux oscillateurs internes, aussi appellés "sources d'excitation". Le premier est une sorte de DDS utilisant un "chirp ROM" interne qui contient les données produites par la voix d'une personne (différente selon les versions du synthétiseur). Lu tel quel, le son ressemble à un "eeeu" et est utilisé pour produire les sons voisés (voyelles par exemple).
Le deuxième oscillateur est un générateur de bruit constitué d'un registre à décalage. Les habitués des générateurs de sons des années 80/90 reconnaîtront les canaux de bruit blanc basés sur ce genre de registre. Cette source est utilisée pour produire les sons non-voisés.

Pour gagner encore plus de place, les informations sont inscrites seulement si elles sont indispensables, il existe donc des tailles de trames différentes selon les informations nécessaires. Le synthétiseur est capable de reconnaître le type de trame au fur et à mesure qu'il lit les données. Il possède aussi une RAM interne pour stocker la dernière trame lue, afin de pouvoir la répéter si besoin (elle n'est pas relue).

  • Pour coder une trame voisée (pitch différent de 0), toutes les informations sont nécessaires (E,R,P et K1~K10), soit 49 bits.
  • Pour coder une trame non-voisée (pitch a 0), c'est pareil sauf qu'il ne faut que les 4 premiers paramètres K soit 28 bits en tout.
  • Pour répéter la dernière trame, il faut E, R et P, soit 10 bits.
  • Pour coder une trame silencieuse, seuls les 4 bits de l'énergie sont utilises (E = 0).
  • Pour indiquer la fin du mot ou de la phrase, pareil, sauf que l'énergie est fixée a 15.
Type de trame Conditions Taille (bits) Informations
Voisée 0<E<15, P>0, R=0 49 E, R, P, K1-K10
Non-voisée 0<E<15, P=0, R=0 28 E, R, P, K1-K4
Répétition 0<E<15, R=1 10 E, R, P
Silence E=0 4 E
Fin de mot/phrase E=15 4 E

SimulationAu niveau interface électronique, on trouve d'un côté une interface 4 bits (CTL1~8) bidirectionnelle pour le processeur, pilotée par un CS et une horloge PDC. Et de l'autre côté une autre interface 4 bits vers le(s) ROM(s) ainsi que 2 signaux de commande M0 et M1 pour ceux-ci.

Le synthétiseur sert aussi comme générateur d'horloge grâce à un circuit RC externe, et produit ainsi l'horloge pour le processeur (CPUCLK) et pour les ROMs (ROMCLK).

La sortie analogique se fait sur les broches 11 et 12 (push-pull).

Le processeur commande le synthétiseur en lui envoyant des codes 4 bits après avoir mis CS à l'état haut (codes qui ne correspondent pas du tout à ceux dans la doc du TMS5220), ceux utilisés dans la dictée magique sont:

  • 10: Parler. Lire le bitstream depuis le ROM.
  • 0: NOP. Ne rien faire.
  • 14: Lire l'état. Au deuxième front sur PDC, le bit 0 (CTL1) deviendra une sortie et indiquera si le synthétiseur est en train de parler.
  • 2: Charger 4 bits d'adresse dans les ROMs.
  • 8: Lire un bit depuis le ROM.
  • 4: Lire 4 bits depuis le ROM.

La lecture du ROM se fait bit-par-bit grâce à l'utilisation de plusieurs commandes "8" afin de charger un registre interne 4 bits, puis de lire ce registre avec la commande "4". L'utilisation de ces commandes est détaillée dans la page traitant des ROMs.

Une fois la lecture démarrée, le synthétiseur ne s'arrête de parler que lorsqu'il rencontre une trame avec énergie à 15.

footer
symbol symbol symbol symbol symbol