|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
Sur nos ondes ce mois-ci un reportage exclusif de notre envoyé spécial au coeur des circuits sonores de l'Amiga, pour comprendre comment est créé aujourd'hui le son de demain, grâce à la technologie DMA mise au point dans les studios Commodore. "A-News : pour ceux qui ont quelque chose entre les oreilles..." Partie I : définir et lancer un son par le DMA 1... 2... 3... oui ?... c'est à moi là ?... Ok j'y vais... Eh bien nous sommes donc ici en direct au plus profond des circuits spécialisés, c'est assez impressionnant je dois le dire, et c'est ici qu'est créé le son que vous entendez tous les jours en allumant votre Amiga. Ce dernier dispose de quatre canaux sonores, les canaux 0 et 3 formant la voie stéréo gauche et 1 et 2 la voie stéréo droite. A chacun d'eux correspond un canal DMA. C'est par ce canal DMA qu'un son stocké en mémoire Chip sera directement émis à travers un convertisseur numérique/analogique (l'opération inverse de la numérisation quoi...). Outre le canal DMA entrent en jeu un certain nombre de registres qui servent à définir le son que l'on veut obtenir en sortie. Il existe un tel jeu de registres pour chaque canal. Je me dirige maintenant vers eux... on peut distinguer : 1. Les registres de localisation Les registres AUDxLC sont des registres 32 bits divisés en deux mots de 16 bits de façon à fournir un vecteur de poids fort et un vecteur de poids faible qui contiendront l'adresse du début de la table d'onde, les trois bits de poids fort étant dirigés vers le premier registre AUDxLCH et les 16 bits de poids faible vers le second AUDxLCL selon les conventions de la programmation du 68000. Cette table d'onde devra se situer en mémoire Chip et débuter à une adresse paire. Elle sera constituée d'un nombre pair d'échantillons codés sur 8 bits, prenant des valeurs de -128 à +127. Exemple d'un signal en dents de scie :
"table" correspond à l'adresse paire de départ de la table d'onde en mémoire Chip. On initialise généralement les deux registres AUDxLCH et AUDxLCL en une seule fois de la façon suivante :
2. Les registres de longueur Le DMA "raisonnant" (et non pas résonnant, encore qu'ici...) en mots binaires on y inscrira la longueur de la table d'onde en nombre de mots et non pas en nombre d'octets. Exemple pour le signal en dents de scie du dessus :
C'est évident mais mieux vaut tout de même le rappeler, AUDxLEN est un registre de 16 bits, la plus grande valeur qu'il est donc susceptible de prendre est $FFFF soit 65535. Le DMA son peut donc traiter des tables d'onde de 131070 échantillons maximum d'un seul coup. Si c'est largement suffisant pour ce petit signal en dents de scie, il faudra en tenir compte par exemple lors de la "découpe" d'une chanson pour la numériser. 3. Les registres de période Ces registres contiennent la période du son. Elle est définie par : période = 1 / (taux d'échantillonnage * durée d'un cycle de bus) La durée d'un cycle de bus est de 279,365 nanosecondes (10^-9 s) le taux d''échantillonnage vous est donné lorsque vous numérisez un son. Par exemple, si vous numérisez un son en 10 kHz la période sera de : 1 / (10000 * 279,365 * 10^9) = 357,954 soit 358. De plus, le taux d'échantillonnage est défini par : taux d'échantillonnage = fréquence * nb d'échantillons par oscillation Ce qui nous permet de jouer de n'importe quel son numérisé comme d'un instrument. En effet, reprenons par exemple le son en dents de scie vu plus haut pour faire un "la" classique à 440 Hz le taux d'échantillonnage va être de : taux d'échantillonnage = 440 * 12 (il y a 12 échantillons) soit 5280 Hz. D'où la période = 1 / (5280 * 279,365 * 10^-9) = 677,944 soit 678.
4. Les registres de volume Ces registres acceptent des valeurs de 0 (inaudible) à 64 (intensité maximale), lesquelles donnent une commande logarithmique du volume mieux adaptée aux phénomènes audio qu'une échelle linéaire. Une fois tous ces registres initialisés, reste à ouvrir le canal DMA correspondant au canal audio souhaité. Cela se fait, une fois n'est pas coutume, grâce au célébrissime registre DMACON d'adresse $DFF096. Nous rappelons à nos auditeurs que : le bit 15 de ce registre doit être fixé à 1 en écriture, le bit 9 est un interrupteur général pour le DMA, les bits 0 à 3 sont les bits de validation des canaux 0 à 3 du DMA son. Ainsi pour lancer le son du canal 0 :
...avec $8201 = $8000 (bit 15) + $200 (bit 9) + $1 (bit 0) Démoniaaak ! Nous allons maintenant assister au lancement en direct du son que nous venons de définir, attention... Hein ?... Quoi ?... Comment çà, pas de son ? Veuillez nous excuser... un petit incident technique... les facéties du direct... Oui ? Ah, bien sûr ! N'oubliez pas de faire un bon vieux "NoFastMem" si vous avez une extension mémoire, ou faites une boucle qui recopie la table d'onde en mémoire Chip si nécessaire. Bon, c'est prêt là ? Ok, on refait un essai : "biiiiiii". C'est bon ! Partie II : arrêter un son (au bon moment) Mais comment on arrête tout ce raffut maintenant ? C'est une bonne question, et je vous remercie de me l'avoir posée. Voyons tout d'abord ce qui se passe une fois le canal DMA activé. Avant que le contrôleur DMA ne prélève les premiers échantillons de la mémoire, il copie le contenu des registres AUDxLC et AUDxLEN dans des registres internes (auxquels nous n'avons pas accès). Une fois ces deux transferts effectués une interruption audio est libérée (chacun des quatre canaux est apte à libérer sa propre interruption), c'est seulement à ce moment que le contrôleur DMA commence à prélever des échantillons de données deux par deux (c'est-à-dire mot par mot). A chaque fois, il décrémente de 1 le registre interne initialisé avec la valeur de AUDxLEN et qui fait office de compteur. Une fois ce dernier arrivé à 0, une oscillation complète a été prélevée. Les registres AUDxLEN et AUDxLC sont à nouveau lus, il y a une nouvelle interruption, et le processus recommence... indéfiniment si on ne l'arrête pas. Or donc, fidèles zoditeurs qui connaissez actuellement les affres d'un bip prolongé à 440 Hz (surtout que bien aiguisé, un signal en dents de scie, ça fait toujours très mal...), voici venu le temps de la délivrance : pour arrêter un son lancé avec le DMA, vous pouvez directement fermer le canal DMA, en annulant le bit correspondant dans DMACON (bit du canal à 1 et bit 15 à 0) soit, pour notre exemple :
"...iiiip". Ouf ! Ça fait du bien quand ça s'arrête ! Vous pouvez également mettre le volume à 0 dans AUDxVOL, ce qui n'est pas vraiment un arrêt mais qui soulage tout de même bien les oreilles. Dans les deux cas l'arrêt est immédiat. Mais vous pouvez aussi - puisque le contrôleur DMA travaille sur ses registres internes - changer le contenu des registres AUDxLC et AUDxLEN. Ainsi lorsque l'oscillation en cours sera terminée, vos nouvelles données seront automatiquement chargées dans les registres internes. Vous pouvez dans ce cas faire pointer AUDxLC sur la suite de la numérisation ou bien, sur une table d'onde vide qui fera le silence, par exemple :
Quelle que soit la méthode pour laquelle vous opterez, vous allez rapidement vous rendre compte que tout ceci irait tout de même mieux si l'on disposait d'un moyen pour savoir quand se termine une oscillation, c'est-à-dire quand le son aura effectué un cycle. En fait, nous disposons d'un tel moyen comme le canal DMA libère une interruption à chaque fois qu'il a recopié des valeurs dans ses registres internes, et que cela se passe avant de prélever les échantillons, le son aura effectué "n" cycles à la "n+1"ième interruption. Il suffit donc d'autoriser les interruptions du canal sonore souhaité et d'en tenir une petite comptabilité. Celles-ci sont de niveau 4 et le vecteur d'interruption de ce niveau a pour adresse $70. Pour autoriser une interruption il suffit de mettre les bits 15, 14 et le bit correspondant au canal souhaité à 1 dans le registre INTENA d'adresse $DFF09A et pour savoir s'il y a demande d'interruption on teste ce même bit dans le registre INTREQR ($DFFO1E), les canaux audio 0 à 3 correspondant respectivement aux bits 7 à 10 de ces deux registres. Armés de ces quelques indications vous êtes à même de comprendre le listing qui accompagne ce reportage à sensations. Il joue "cycles" fois une oscillation décrite à partir de "table". Pour cela, chargez à partir de ce label une table d'onde (de préférence une numérisation de musique pour bien différencier les cycles). Attention, elle ne doit contenir que les échantillons et pas d'en-tête IFF (utilisez par exemple l'option de sauvegarde "dump" sous Perfect Sound). C'est tout pour aujourd'hui, je rends l'antenne... "A-News : pas de bla bla, rien que de l'Amiga". Listing
|