home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 15
/
CD_ASCQ_15_070894.iso
/
news
/
569
/
sbal_kit
/
sbenreg
/
sb_enreg.txt
< prev
next >
Wrap
Text File
|
1994-05-25
|
11KB
|
205 lines
TITRE: ENREGISTREMENT DE SONS ANALOGIQUES AVEC CARTES DE TYPE SB/SB PRO
Résumé.............: programme permettant d'enregistrer des sons analogiques
à partir d' un micro sur toute carte compatible
SoundBlaster ou SoundBlaster Pro et avec oscilloscope
temps-réel à l'écran.
Mots-clé...........: Echantillon - Interruption - Timer - DSP - ADC - Mixer
Matériel utilisé...: PC 486DX33 + SB Pro II + micro + TP7
Champ d'apllication: Tout PC (avec carte compatible SB + micro) et langage
I) INTRODUCTION
Dans un précédent article nous avions vu comment jouer des
échantillons digitaux sur toute carte compatible SoundBlaster ou bien sur
le Speaker interne. Cette fois-ci on étudie l'étape précédent cette phase,
et qui consiste donc à pouvoir enregistrer des sons analogiques (à partir
d'un micro) et de les sauvegarder (en tant qu'échantillons digitaux), à
condition toutefois de posséder une carte compatible SoundBlaster ou
SoundBlaster Pro; de plus, l'écran graphique gèrera en temps-réel un
oscilloscope qui pourra être étudié à titre indicatif ou pédagogique.
II) PRINCIPES
a) Généralités
En reprenant le principe utilisé pour le programme SBDigit d'un
précédent article, les données seront cette fois lues sur l'ADC (Analogic
to Digital Converter, et donc à partir du micro) à fréquence constante à
l'aide de la puce Timer 8253. La mini interface graphique en mode 13h
(320x200 en 256 couleurs) contient juste les quelques routines (écrites
entièrement en Pascal) de base utiles au programme; comme le but de cet
article est avant tout l'aspect sonore, l'environnement et la résolution
graphique ont été volontairement simplifiés. Il est à noter que
l' oscilloscope temps-réel n'est pas actualisé dans la routine sous
interruption, mais plutôt par polling à l'intérieur du bloc de saisie
du clavier. En effet, la première méthode aurait créé une petite surcharge
à la routine sous interruption (car l'actualisation de l'écran prend du
temps machine et chaque IT non prise en compte par la routine sous
interruption dégrade alors la fréquence d'enregistrement) ne permettant
pas alors un enregistrement convenable à des fréquences élevées; la deuxième
méthode (celle retenue) par contre ne ralentit pas l'enregistrement et
actualise l'oscilloscope à l'écran en avant-plan par saisie à la volée
d'informations (les octets lus de l'ADC) à sa propre cadence (des données
peuvent alors être ratées mais ce n'est pas grave). On constatera donc que
si la fréquence d'enregistrement est très élevée, c'est alors l'oscilloscope
qui sera ralentit, ce qui est d'ailleurs toujours souhaitable!
b) l'ADC
Au niveau des caractéristiques techniques, on constate qu'en mode
direct (sans DMA) l'ADC permet d'enregistrer des sons de:
- 4KHz à 13KHz sur SB/SB2/SBMCV (la SBMCV est conçue pour les bus MCA)
- 4KHz à 23KHz sur SB Pro/SB Pro II
La façon de programmer l'ADC est aussi simple que celle du DAC.
Le port de commande de la SoundBlaster étant en 2xCh (2x0h est le port de
base où se trouve configurée la carte), il suffit de lui préciser la
commande 20h (accès à l'ADC en mode direct) avant chaque lecture de donnée.
Dès lors, il est possible de lire la donnée sur le port de données situé en
2xAh; attention! avant chaque lecture de donnée, la réaction de la carte à
la commande 20h implique de tester si le bit 7 du registre d'état (2xEh) est
à 1 (pour ne pas lire une valeur qui n'est pas encore arrivée...). Voilà,
c'est tout! Le principe est le même que dans le programme SBDigit d'un
précédent article où il était question du DAC.
c) la puce Mixer
Comme dans l'article sur NonaLiza (et plus particulièrement
NonaPlay), rappelons que la puce Mixer est propre aux SoundBlaster Pro
(et SoundBlaster 16). Le port de commande est situé en 2x4h, et le port de
données/lecture en 2x5h. On peut tester la présente d'une telle puce en
lisant une valeur précédemment écrite à un registre donné (par exemple le
registre 22h qui définit le Master Volume). Attention! ceci ne marche pas
avec une SoundBlaster 16 (elle n'est pas compatible avec la SoundBlaster Pro
au niveau des registres des volumes); le Master Volume des SoundBlaster 16
est situé aux registres 30h ET 31h. En effet, sur les SoundBlaster Pro les
valeurs des volumes gauche et droit allaient de 0 à 15 (2 x 4 bits=1 octet),
mais sur les SoundBlaster 16 les valeurs vont de 0 à 31 (ce qui implique
l'utilisation de 2 registres (2 x 1 octet). Le programme de cet article ne
se contente que de tester la présence d'une SoundBlaster ou d'une
SoundBlaster Pro; les lecteurs désirant tester la présence d'une SB 16
doivent alors d'abord tester la présence d'une SB, PUIS d'une SB 16
(registres 30h et 31h de la puce Mixer), et finalement d'une SB Pro
(registre 22h).
La puce Mixer possède deux registres qui vont particulièrement nous
être utiles:
- le registre 0Ah (volume micro)
- le registre 0Ch (type d'entrée pour l'ADC et choix du filtre).
Les bits 0 à 2 du registre 0Ah définissent la valeur du volume
d'entrée du micro (rien=0 et maximum=7).
Les bits 1 et 2 du registre 0Ch précisent le type d'entrée (Line-In,
CD Audio, Micro) pour l'ADC, en sachant que Micro (défaut)=00b ou 10b,
CD Audio=01b, et Line-In=11b. Les bits 3 à 5 servent à définir un filtre
en sachant que Filtre Haut (défaut)=0x0b, Filtre Bas=0x1b, et
Sans Filtre=1xxb.
Si par exemple on choisit d'enregistrer à partir du CD Audio avec un
Filtre Bas, il faudra préciser au registre 0Ch la valeur XX0x101X (c-à-d
0Ah, les X représentent les bits non utilisés et les x les bits non
significatifs). Dans ce cas, le réglage du volume du micro (registre 0Ah)
n'a aucun intérêt. Dans le cas qui nous préoccupe, il faut choisir le Micro
comme type d'entrée, sans filtre, et régler son volume au maximum. Ceci
s'effectue en précisant donc la valeur XX1xx00X (c-à-d 20h) en 0Ch et 07h
en 0Ah.
Que gagne t-on de plus avec une puce Mixer? Et bien, maintenant le
son du micro est mélangé en circuit direct à l'amplificateur (sans forçément
enregistrer!). Ceci n'est pas possible sur une SoundBlaster normale, et
il n'est donc pas possible d'avoir un retour direct de ce qui passe par le
Micro (car il n'y a pas de puce Mixer...); seule l'animation de l'écran
permet alors de se rendre compte que l'ADC fait bien son travail. Que ce
soit dans un cas comme dans l'autre, les données ne peuvent pas être
transmises en sortie à l'amplificateur de la carte par la voie normale du
DSP sinon rien ne fonctionnerait (c'est normal puisqu'on traite un signal en
entrée et non pas en sortie!); pour cela il faut donc désactiver la sortie
vers l'amplificateur via le DSP en précisant la commande D3h au port 2xCh.
J'avais quand même essayé d'obtenir le retour du son du micro en direct sur
une SB normale en désactivant l'amplificateur pour lire la donnée et tout de
suite après en activant l'amplificateur pour émettre la donnée, et ce à
chaque appel de la routine sous interruption; en fait, le rendu est décevant
(on ne discerne pratiquement pas le son car la désactivation/activation
intempestive de l'amplificateur génère un parasite non négligeable (par
exemple à 13KHz, avec 13000 désactivations/activations par seconde, il est
difficile de reconnaître les données réelles dans le brouhaha constant causé
par tous ces parasites!).
III) LE PROGRAMME: SB_Enreg
Voici finalement le descriptif du programme d'enregistrement. Il se
présente principalement sous la forme d'un oscilloscope graphique avec une
ligne contenant les commandes disponibles.
La grande ligne centrale indique un silence continu; dès qu'un
événement sonore est suffisament audible, cette ligne se transforme en une
succession de courbes diverses modélisant le son ainsi capté.
Les données sonores sont lues en permanence à partir du micro à la
fréquence précisée dans le programme (11KHz pour une SB et 16KHz pour une
SB Pro). Les différentes touches opérationnelles (en majuscules ou
minuscules) sont:
- M pour <M>arche: l'enregistrement démarre alors réellement jusqu'à ce que
le tampon soit effectivement plein (64999 octets, c-à-d
environ 1 segment à 0.5Ko près, et pour rester
compatible avec le programme SBDigit) ou que l'Arrêt ait
été demandé.
- A pour <A>rrêt.: l'enregistrement est arrêté. Il est alors possible
de sauvegarder ou de démarrer un autre enregistrement.
- S pour <S>auver: le tampon de la séquence enregistrée est sauvegardé sur
disque sous l'appellation SB_ENREG.xxx ou xxx est un
nombre de 000 à 999 qui est incrémenté à chaque nouvelle
sauvegarde lors d'une même session (attention! en cas de
nouvelle session du programme, le compteur recommence
à partir de 000 et efface les éventuelles sauvegardes
précédentes de même nom). Pendant la phase de sauvegarde
l'oscilloscope est momentanément désactivé.
A tout moment, l'appui de la touche ESC permet de terminer la
session courante en quittant le programme.
Voici le texte du programme:
SE REPORTER ICI AU SOURCE DU PROGRAMME SB_ENREG.PAS
IV) AMELIORATIONS
Toujours le même souçi... il est effectivement possible d'optimiser
le code (en assembleur par exemple?), d'activer tel ou tel filtre en mode
interactif, etc... Il serait également intéressant de pouvoir enregistrer
des sons sans limitation de taille (via l'XMS ou en accès disque continu),
et pourquoi pas en choisissant un format connu de sauvegarde (VOC, WAV,
etc...)? Et bien sûr, de remanier complètement la structure du programme
pour permettre le traitement de l'ADC en mode DMA (certes, un peu plus
compliqué...)!
V) CONCLUSION
On a montré dans cet article comment il était possible d'enregistrer
des sons analogiques à partir d'un micro situé sur des cartes de type
SoundBlaster et SoundBlaster Pro. De ce fait, on a brièvement expliqué le
fonctionnement de l'ADC et décrit certaines fonctionnalités de la puce
Mixer.
le 25/05/94
Patrick RUELLE
43, av. de Grande Bretagne
98000 Monaco
Principauté de Monaco