Obligement - L'Amiga au maximum

Lundi 02 juin 2025 - 01:42  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

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

Articles in English


Réseaux sociaux

Suivez-nous sur X




Liste des 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,
ALL


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


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : Utilisation et programmation de Paula
(Article écrit par Philippe Rivaillon et extrait d'Amiga News Tech - janvier 1992)


Ah, quelle belle chose que d'avoir un ordinateur capable de générer autre chose que de vulgaires petits bips... L'Amiga est, comme chacun sait, assez riche dans ce domaine puisqu'il dispose de quatre canaux sonores indépendants pour ravir vos oreilles en stéréo.

Et qui doit-on complimenter pour cela ? C'est Paula (et accessoirement Agnus pour les transferts DMA). Mais ses pouvoirs ne s'arrêtent pas à un simple "recrachage" d'échantillons. En effet, cette diva est capable de moduler l'amplitude et la fréquence de sortie d'un ou plusieurs canaux sonores afin de produire les effets voulus. Et si cela ne vous suffit pas, alors vous pouvez toujours faire joujou avec le filtre passe-bas mis à votre disposition.

A quoi tu joues, Paula ?

Un son étant une vibration, il est défini par deux critères : son amplitude et sa fréquence. Cette dernière définira si un son est grave ou aigu (plus la fréquence est élevée, plus le son est aigu). L'amplitude moyenne définit la puissance d'un son (ou le volume), tandis que les variations de cette même valeur définissent le son lui-même. La table de données transmise à Paula sera donc une suite d'amplitudes instantanées. Cette table sera découpée en octets, ce qui autorise des amplitudes de +127 à -128. Paula aura bien entendu besoin d'autres renseignements sur le son avant de le jouer : son adresse, sa longueur, sa période (correspondant à la fréquence du signal) et son volume (force avec laquelle il sera joué). Mais voyons tout de suite les registres mis en cause.

AUD*LCH   $DFF0+0   Adresse du son (3 bits hauts)
AUD*LCL   $DFF0+2   Adresse du son (16 bits bas)

Ces deux registres peuvent bien entendu être initialisés en même temps de la façon suivante à l'aide d'une seule instruction 68000 MOVE.L. Notez que les données doivent se trouver en mémoire Chip.

AUD*LEN   $DFF0+4   Longueur du son (16 bits)

La longueur de l'échantillon est exprimée en mots. On remarque donc que le maximum est de 128 ko... C'est déjà pas mal, non ?

AUD*PER   $DFF0+6   Période du son (16 bits)

Cela permet de fixer la rapidité de restitution de l'échantillon. Le nombre transmis dans ce registre s'exprime en cycles machines. Pour ceux qui préfèrent parler de fréquence (en octets par seconde), voilà la formule de conversion :

PERIODE = 1/(FREQUENCE)/279,365.10-9

Le dernier nombre n'est autre que la durée d'un cycle machine pour le 68000. Sachez de plus que le circuit audio a tout de même des limites du fait de sa synchronisation avec l'écran : sachant qu'il charge un mot de données sonores par ligne écran, on obtient une fréquence théorique maximale de (2 octets * 262.5 lignes/écran * 59,94 écrans/seconde), soit 31 469 octets/seconde. Mais tout ceci reste théorique : comme le contrôleur n'a pas que ça à faire, la fréquence maximale est de 28 867 octets/seconde, soit encore une période de 124 cycles. Si malgré cela, vous mettiez une valeur inférieure à 124 dans ce registre, Agnus n'aura pas forcément le temps de charger la donnée audio et c'est l'ancienne qui sera utilisée, d'où une déformation du son.

AUD*VOL   $DFF0+8   Volume du son (16 bits)

Juste une note pour ce registre : seuls les 6 bits inférieurs définissent le volume. Le volume maximal est donc de 63 et une valeur de 0 le coupe totalement. Les autres bits n'ont aucune utilité. Enfin, voici quelques notes supplémentaires sur ces adresses :
  • Elles sont uniquement accessibles en écriture.
  • Le signe "*" représente le numéro du canal (0 à 3).
  • Le signe "+" signifie égale $A pour le canal 0, $B pour le canal 1, $C pour le canal 2 et $D pour le canal 3.
Dis papa, comment ça marche ?

Maintenant que vous connaissez les registres qu'il faut utiliser, on va pouvoir passer à la pratique. Nous allons débuter par une simple émission de son en mode automatique : Paula s'occupe de tout... ou presque.

Tout d'abord, on initialise de la façon indiquée les registres décrits plus haut, et ceci pour chaque canal à mettre en oeuvre. Pour lancer le(s) son(s), il suffit alors d'autoriser les canaux DMA nécessaires (bits 9 et 0 à 3 du registre DMACON). L'émission du son commencera aussitôt et se poursuivra jusqu'à ce qu'on l'arrête : Paula, après avoir lu le nombre de mots indiqué dans AUD*LEN, se replacera automatiquement au début des données (hmmm, les belles numérisations bouclées).

Pour arrêter toute émission sonore, il suffit d'effacer les bits de DMACON correspondant aux canaux à bloquer. Notez que si vous remettez en route ces canaux DMA, Paula recommencera le son du début, à une exception près : si l'intervalle de temps écoulé entre la coupure et la remise en route est inférieure à deux fois la période, alors la lecture se poursuivra de là où Paula l'avait laissée (ce phénomène sera expliqué ultérieurement).

Arrivé ici, un rappel des bits important de DMACON n'est sans doute pas inopportun.

DMACON   $dff096 (écriture)
DMACONR  $dff002 (lecture)

Bit Nom Fonction
15 SET/CLR Voir note
9 DMAEN Lorsque ce bit est mis, tous les canaux DMA
peuvent être utilisés. S'il est à 0, les canaux
DMA sont bloqués
3 AUD3EN En mettant ce bit à 1, on démarre la sortie audio du
canal 3 (gauche).En effaçant ce bit, on interrompt la sortie
2 AUD2EN Idem pour le canal 2 (droite)
1 AUD1EN Idem pour le canal 1 (droite)
0 AUD0EN Idem pour le canal 0 (gauche)

Note : lors d'une écriture, si le bit 15 SET/CLR est mis, tous les autres bits à 1 du mot transféré sont mis à 1 dans DMACON, ceux à 0 restant inchangés. Si SET/CLR est à 0, tous les bits à 1 de la source seront effacés dans la destination, ceux à 0 restant inchangés.

Action !

Voilà un petit exemple pour achever de vous convaincre de la facilité de la chose...

Paula
Paula

(*) Vous remarquerez que je n'ai pas mis le bit 9 de DMACON à 0. En règle générale, il vaut mieux s'abstenir, car cela interdirait tout travail du DMA. Pour être rigoureux, il faudrait le remettre comme il était avant.

Oh, Paula, tu me fais de l'effet !

On peut distinguer deux sortes de modulations possibles : la modulation d'amplitude (volume) et la modulation de fréquence (période).

La première pourra servir à faire des effets du type vibrato, tremolo, imitation du rapprochement ou de l'éloignement d'un son, etc. La seconde permet entre autres de simuler des accords. De plus, il est possible de combiner les deux modulations. Bref, les possibilités sont énormes. Seule ombre au tableau : pour moduler une voix, on est obligé d'utiliser deux canaux consécutifs.

Le premier (celui de plus basse numérotation) sert pour l'enveloppe et le second (celui de plus forte numérotation) sert pour le son de base. Les registres des canaux sont initialisés comme s'il s'agissait de sons ordinaires (il est toutefois inutile d'initialiser le volume du canal de modulation, puisque celui-ci ne sera pas joué). Par contre, pour le canal de modulation, la table de données n'est plus composée d'octets mais de mots représentant soit un volume (0 à 64) soit une période (avec les mêmes restrictions que celles citées plus haut). Si vous voulez faire une modulation en fréquence et en amplitude à la fois, la table doit contenir alternativement un volume et une période, dans cet ordre. Dans ce dernier cas, Il y aura deux lectures au lieu d'une afin que les modulations se fassent simultanément et non l'une après l'autre. Pas besoin donc de toucher à la période pour compenser.

Une fois que vous avez initialisé correctement les registres de deux canaux consécutifs et fait votre table de modulation, il vous suffit de les "lier" pour la modulation à l'aide du registre ADKCON (qui sert aussi au pilotage des lecteurs de disquette, alors soyez prudent).

ADKCON   $dff09E (écriture)
ADKCONR  $dff010 (lecture)

Bit Nom Fonction
15 SET/CLR Même fonction que DMACON
7 ATPER3 Si ce bit est mis, la voix 3 ne module la période
d'aucune autre voix (cela la coupe)
6 ATPER2 Si ce bit est mis, la voix 2 module période de la voix 3
5 ATPER1 Même chose avec les voix 1 et 2
4 ATPER0 Même chose avec les voix 0 et 1
3 ATVOL3 Si ce bit est mis, la voix 3 ne module le volume
d'aucune autre voix (cela la coupe)
2 ATVOL2 Si ce bit est mis, la voix 2 module le volume de la voix 3
1 ATVOL1 Même chose avec les voix 1 et 2
0 ATVOL0 Même chose avec les voix 0 et 1

Note : les bits 7 et 3 ont le même effet, ils coupent tous les deux la voix 3, qui est la plus haute et ne peut donc pas en moduler d'autre. Bien qu'aucun son ne sorte, les données continuent à être chargées normalement par Agnus. Ces deux bits identiques n'ont en fait aucune utilité. On peut à la limite s'en servir pour créer un morcellement de la sortie audio dans la voix 3 (un coup rien, un coup de la musique et ceci à la fréquence avec laquelle vous mettez et enlevez ce bit). Mais il existe d'autres méthodes pas plus contraignantes pour faire cela (modulation d'amplitude avec une table composée de seulement deux valeurs, à savoir 0 et 64).

Une fois que vous avez lié les deux canaux choisis, il ne reste plus qu'à autoriser le transfert DMA sur ces deux canaux avec DMACON (comme pour des sons ordinaires). L'effet sera le suivant : le son de base sera joué sur la voix la plus haute des deux. Il utilisera comme volume ou fréquence (ou les deux) les mots chargés à chaque période du canal de modulation. Notez que ces mots sont chargés à l'adresse du volume où de la fréquence du canal modulé. Si vous arrêtez la modulation, n'oubliez pas de réinitialiser le volume ou la fréquence des canaux modulés et de couper les canaux DMA des canaux modulants.

Note : rien n'empêche de moduler un canal "à la main" en tripatouillant le volume ou la fréquence du canal voulu. Cela évitera d'utiliser deux canaux, mais adieu synchronisation et facilité d'emploi (sans compter que le 68000 sera alors utilisé en permanence pour le son). Enfin, ça peut toujours servir...

Action 2, le retour !

Et voilà l'exemple tant attendu qui prouve une fois encore que ce n'est pas si compliqué que ça en a l'air.

Paula

Deux modes

Il faut distinguer deux modes d'utilisation du circuit audio : le mode automatique, utilisant les canaux DMA, et le mode manuel, utilisant le 68000. Le premier devrait maintenant vous être familier, puisque c'est celui que nous avons développé jusqu'ici. Pourtant, vous ignorez encore certaines choses sur ce mode de fonctionnement, que nous allons maintenant disséquer. L'Amiga ne dispose pas d'un circuit audio, mais de quatre, c'est-à-dire un pour chaque voix. De même, Agnus utilise quatre canaux DMA pour transférer les données (rappelons qu'Agnus n'est qu'un larbin qui porte les colis ; c'est Paula qui orchestre tout).

Après avoir initialisé les registres correspondant à un canal, vous autorisez les transferts DMA à travers ce canal. A ce moment, que se passe-t-il ? Paula transfert l'adresse et la longueur du son dans ses propres registres internes (spécifiques à chaque canal). Après, elle génère une interruption de niveau 4 pour avertir le 68000 qu'elle a fini l'opération (nous reviendrons sur cette interruption plus tard). Le processeur peut alors changer le contenu des registres concernant l'adresse et le volume du son, cela n'influera en rien la sortie audio en cours. Pendant ce temps, Agnus charge un mot de donnée toutes les deux périodes dans le registre AUD*DAT.

AUD*DAT  $DFF0+A   Données du son (16 bits)
  • * = numéro du canal.
  • + = $A pour le canal 0, $B pour le canal 1, $C pour le canal 2 et $D pour le canal 3.
Je vous rappelle qu'une coupure du canal DMA est sans effet si elle dure moins de temps que deux fois la période du son joué... Cela vient du fait que l'état du canal DMA n'est vérifié qu'avant chaque transfert de données. Donc, si vous le coupez et le réautorisez entre deux transferts, c'est comme s'il ne s'était rien passé. Et le temps entre deux transferts est le double de la période du son, puisque les données sont chargées mot par mot.

Les données situées dans AUD*DAT seront ensuite converties du format numérique au format analogique, pour être exportées vers les prises de sortie audio de l'Amiga. Une fois arrivée à la fin de l'échantillon sonore, Paula rechargera le contenu des registres sonores dans ses propres registres internes et générera à nouveau la même interruption, et ainsi de suite jusqu'à ce que les transferts DMA soient arrêtés.

Quelques problèmes... et leur solution

Premier problème. Imaginons que nous voulions lancer en même temps le même son sur les quatre canaux. Si les sorties ne sont pas synchronisées entre elles, cela va produire une jolie cacophonie, voire cacaphonie. Cela ne se produira toutefois que dans un cas précis : si l'ordinateur jouait déjà un son sur l'une ou plusieurs des voix. Dans ce cas, Paula ne tiendra compte du nouveau son qu'après avoir fini celui qu'elle était en train de jouer, d'où un décalage par rapport au son qui a débuté immédiatement.

J'en vois déjà qui pensent qu'il suffit d'interdire les transferts DMA de tous les canaux sonores, d'initialiser les registres qu'il faut puis d'autoriser ses propres canaux. Eh bien non, car qui vous dit que la coupure des canaux DMA aura duré moins de deux fois la période du son ? Pour en être sûr, il faut attendre le temps que dure deux fois la plus longue période possible, 65 535 cycles, ou 20 millisecondes environ. Soit vous utilisez un chronomètre des CIA pour cela, soit vous utilisez une petite boucle faisant au moins 65 535 cycles. Mais la première solution semble la plus propre et assurera un fonctionnement sur tout Amiga, même équipé d'une carte accélératrice. Pour résumer : avant tout travail avec Paula, s'assurer que les précédents transferts DMA sont bel et bien terminés.

Deuxième problème. Imaginons que vous vouliez raccorder deux sons (par exemple, deux morceaux d'une numérisation trop longue pour être jouée en une fois). Comment faire ? Voilà la recette : vous lancez le premier morceau normalement. Après avoir chargé le contenu des registres, Paula provoque une interruption de niveau 4. C'est là que vous intervenez : vous saisissez l'interruption au vol, réinitialisez l'adresse et la longueur du son s'il le faut avec celles du deuxième morceau (sans toucher à DMACON) et le tour est joué. En effet, lors de la seconde lecture, ce sont les registres nouvellement initialisés que Paula chargera, et ce sera donc le nouveau morceau qui sera joué. Si vous avez plus de deux morceaux, le système est bien entendu exactement le même.

Mais revenons sur cette interruption qui n'est peut-être pas connue de tous. Lorsqu'une interruption est générée, l'Amiga bloque le système et saute à l'adresse correspondante (pour les interruptions de niveaux 1 à 7, l'adresse de saut est indiquée en mots longs de l'adresse $64 à $80). L'interruption est alors traitée et la main est ensuite rendue au système. Une routine de traitement d'interruption doit toujours commencer par sauver les registres du processeur qu'elle utilise, vérifier la provenance de l'interruption et voir si elle est autorisée, la traiter le cas échéant (puis indiquer qu'elle a été traitée, sinon l'ordinateur sera bloqué en traitant à l'infini la pauvre interruption qui n'en demandait pas tant), restaurer les registres et impérativement finir par un RTE.

INTENA   $DFF09A   Interruptions autorisées (écriture)
INTENAR  $DFF01C   Interruptions autorisées (lecture)
INTREQ   $DFF09C   Interruptions demandées (écriture)
INTREQR  $DFF01E   Interruptions demandées (lecture)

Bit Nom Fonction
15 SET/CLR Même fonction que DMACON
14 INTEN Les interruptions ne peuvent avoir lieu
que si ce bit est mis dans INTENA
10 AUD3 Interruption pour le canal 3
9 AUD2 Interruption pour le canal 2
8 AUD1 Interruption pour le canal 1
7 AUD0 Interruption pour le canal 0

Pour clarifier tout ça, voici un petit exemple de routine de gestion de l'interruption sonore.

Paula
Paula

Attention ! Si le morceau suivant n'a pas la même fréquence, ou si vous voulez changer son volume, vous devrez attendre le commencement de ce morceau (chargement des registres) pour effectuer les changements. En effet, le volume et la fréquence ne sont pas sauvegardés par Paula : elle travaille directement dessus.

On est jamais mieux servi que par soi-même

Bon, il est temps de passer au mode manuel. Ici, plus question de remplir AUD*LCH, AUD*LCL et AUD*LEN ni d'autoriser un quelconque DMA : vous devrez vous occuper vous-mêmes de ces choses. Par contre, il est toujours aussi nécessaire d'indiquer le volume (AUD*VOL) et la période (AUD*PER) de l'échantillon sonore. Après, vous transférez le premier mot de données sonores dans l'AUD*DAT correspondant au canal choisi (vous vous rappelez ? C'est l'adresse où Agnus chargeait les données sonores pour chaque canal). Cela aura pour effet d'amorcer le processus : le mot sera lu à la fréquence indiquée et une interruption de niveau 4 sera générée (la même que tout à l'heure) indiquant que vous pouvez envoyer le mot de données suivant. Si vous ne saisissez pas l'occasion, la transmission sonore prendra fin. Pour repartir, vous serez obligé de réamorcer le processus. Sinon, tout se poursuivra normalement.

Je ne vais pas vous présenter une routine d'application parce qu'elle serait la même que celle ci-dessus, à quelques détails près :
  • Plus de table définissant les fragments, mais seulement un pointeur et les données sonores (la détection de fin se fait ici sur la fin de l'échantillon).
  • Plus d'autorisation de DMA concernant les canaux utilisés. Il faut même les interdire, sinon les intervalles entre interruptions ne seront plus ceux attendus.
  • Plus de transfert d'adresse et de longueur durant l'interruption. Un seul mot de données sonores dans AUD*DAT (ne pas oublier le premier transfert permettant l'amorçage).
Ce mode de fonctionnement est tout de même assez contraignant, puisqu'il demande une attention constante de votre part. De plus, il coûte cher en cycles, puisque le 68000 est sans cesse requis (de ce fait, il n'est pas trop conseillé dans une démo ou tout autre programme demandant un travail conséquent en parallèle). Mais là s'arrêtent ses défauts... Vous me direz : c'est déjà pas mal... A mon avis, ce système est parfait pour un programme se bornant à faire de la musique. Certains semblent sceptiques... Je m'en vais les convaincre.

Le prèmier avantage de ce système est qu'il permet d'utiliser des échantillons dont la longueur ne dépend que de la capacité mémoire (c'est sûr, ce n'est pas très percutant comme argument).

Le second avantage est que vous pouvez faire de la modulation de fréquence et d'amplitude en utilisant uniquement la voix que vous voulez moduler. En effet, rien n'empêche de modifier le volume et la période du signal en même temps que vous chargez un mot de donnée dans AUD*DAT. Vous serez bien synchronisé cette fois-ci (là, ça commence à devenir intéressant...).

Le troisième avantage est que vous pouvez réaliser assez "facilement" de nombreux effets, tels que de l'inversion de son, du "scraching", entrecoupement d'échantillons, etc. (certes, ce serait possible en mode automatique, mais ce ne serait guère plus simple).

Le quatrième avantage n'est pas des moindres : vous pouvez mélanger en temps réel plusieurs signaux. En d'autres termes, vous pouvez faire croire que l'Amiga a plus de quatre voix (comment croyez-vous que font les logiciels de musique en huit voix ?). Le subterfuge est simple : on sait que le son est défini par ses variations d'amplitude. Pour mixer deux sons, il suffit donc d'ajouter les amplitudes instantanées des deux signaux, en tenant compte des différences de volume et de fréquence (eh oui, sinon vous devrez toujours avoir des signaux dont la fréquence d'échantillonnage est la même et des notes de musique identiques sur un même canal). De plus, vous devez vous assurer que le résultat de l'opération a les dimensions requises (amplitude comprise entre +127 et -128).

NDLR : cinquième avantage du mode manuel, les données sonores n'ont plus besoin de se trouver en mémoire Chip puisque le DMA n'est pas sollicité. Ça aussi, c'est intéressant !

On le voit, ce mode d'utilisation est tout de même assez riche. De plus, il existe des cas particuliers dans lesquels on peut difficilement s'en passer. Par exemple, pour messieurs les numérisateurs fous, si vous voulez écouter ce que vous allez (où êtes en train de numériser) ce mode est obligatoire.

Un filtre d'ammmmmm...(iga) ?

Mais à quoi sert-il donc, le filtre passe-bas ? Ceux qui pensent qu'il s'agit d'une sorte de "loudness" ont tout faux ! Ce filtre a pour effet de couper toutes les hautes fréquences (sons aigus). Il ne reste alors que des sons graves (basses fréquences). Plus de risques de distorsion (en anglais : aliasing) qui apparaît dans ces bandes de fréquence. C'est donc pour ravir vos oreilles que l'Amiga est équipé de ce filtre. Pour ma part, je préfère quand il n'est pas actif, car la bande de fréquence est alors beaucoup plus complète. Pour l'activer ou le désactiver, il suffit d'enlever ou de mettre le bit 1 du port A du CIA A (adresse $BFE001). Cela a aussi pour effet d'allumer et d'éteindre la diode d'alimentation (pour les anciens Amiga uniquement).

Exemple :

eor.w #2,$BFE001 ; inverse l'état du filtre

Dernières recommandations

Essayez l'effet d'écho obtenu en désynchronisant légèrement deux voix jouant le même son (l'effet est encore meilleur si elles sont sur le même canal stéréo).

Quelques conseils pour avoir des sons de bonne qualité :
  • Utilisez toute la bande d'amplitude qui vous est offerte (+127 à -128). Sinon, il y aura plus de bruit qu'autre chose.
  • N'échantillonnez pas trop bas en fréquence (7000 est vraiment un minimum !).
  • Faîtes débuter et finir vos sons par la même valeur pour éviter les parasites lors des bouclages où des enchaînements.
Et voilà, vous savez tout... A vos claviers !


[Retour en haut] / [Retour aux articles]