Obligement - L'Amiga au maximum

Jeudi 23 novembre 2017 - 12:00  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Dossier : L'audio DMA sur Amiga
(Article écrit par Nicolas Fournel et extrait d'A-News (Amiga News) - juin 1989)


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

audio DMA
audio DMA

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 : dc.b 0,40
dc.b 80,120
dc.b 80,40
dc.b 0,-40
dc.b 80,120
dc.b -80,-40

"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 :

move.l #table,AUD0LCH ; pour le canal 0

2. Les registres de longueur

audio DMA

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 :

move.W #6,AUD0LEN ; pour le canal 0

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

audio DMA

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.

move.w #678,AUD0PER ; pour le canal 0

4. Les registres de volume

audio DMA

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 :

move.w $8201,DMACON

...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...

audio DMA

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 stopper 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 :

move.w #$1,$DFF096 ; ferme le canal DMA son 0

"...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 :

move.w #table_vide,$DFF0A0
move.w #1,$DFF0A4

table_vide: dc.b0,0

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'entê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

audio DMA


[Retour en haut] / [Retour aux articles]