SB16

Un article de Mwyann.info.

   C:\>

      

Ceci est un programme fonctionnant sous DOS, genre MS-DOS 6.22. En principe, ce genre de programmes pourra fonctionner dans une fenêtre "ligne de commande" sous Windows (Démarrer > Exécuter > cmd ou command) mais je ne promets rien. Vérifiez dans la description du programme si c'est possible. Sinon, servez-vous d'un logiciel comme VMware ou DOSBox, ou bien trouvez un vieux PC et installez un MS-DOS comme au bon vieux temps.

   

 

A propos du projet
SystèmeDOS
CompatibleWindows 98
Étape de dév.En cours
LangagePascal
Création04/2007

 

SB16 est un programme de traitement de son que j'ai conçu afin d'avoir le moins de latence possible. Pour ce faire, il utilise deux cartes sons ISA en les contrôlant directement en utilisant DSP, IRQ et DMA. La librairie de lecture et d'enregistrement du son ont étés écrites par moi-même, ainsi que les algorithmes mis en œuvre dans le traitement et l'interface du programme.

J'ai écrit ce programme pour deux raisons : d'abord je voulais savoir comment fonctionnaient les interruptions matérielles, le DMA et les cartes sons (et m'amuser avec), et ensuite je voulais en profiter pour développer moi-même un traitement de son en temps "réel", ou du moins le plus réel possible. Si j'avais utilisé les pilotes Windows, ceux-ci auraient pâtis du buffer interne de Windows, donc un décalage beaucoup trop important. Je voulais qu'il soit possible de parler dans un micro et se réécouter en même temps, sans bégayer.

Sommaire

Présentation

Une copie d'écran de SB16 en fonctionnement, dans une fenêtre de commandes Windows 98. L'écran présente la version des DSP des cartes sons utilisées et la liste des traitements actifs. Il présente également le niveau d'entrée et de sortie en stéréo, ainsi qu'une alerte quand l'entrée se met à saturer. Puis il affiche la phase de l'entrée et de la sortie (mono, stéréo ou inversé), et le niveau de compression lorsque le compresseur est actif.

Pour activer ou désactiver un traitement, il suffit d'appuyer sur la touche numérique correspondante.

Actuellement, la taille du buffer est de 4096 octets. L'enregistrement se faisant à 44100 Hz en stéréo 16 bits, nous avons donc un décalage théorique de moins de 30 millisecondes. Ce qui est un peu ridicule, car les cartes actuelles permettent d'obtenir jusqu'à 1.5 milliseconde de décalage uniquement (selon ma Phase 28, à un taux de 44100 Hz). A 96 kHz, on peut même arriver à 0.7 milliseconde. Ceci dit, c'est déjà pas mal pour une machine aussi (peu) puissante (voir la description de cafetiere).

Traitements

Le programme est actuellement capable d'effectuer tous ces traitements :

Noise Gate

Permet de transformer un son en silence total, en dessous d'un certain seuil, et au delà d'un certain temps.

Stereo Enlarger

Permet d'élargir la stéréo afin d'avoir une spatialisation plus importante.

Compressor

Permet de compresser le son, afin de remonter les sons faibles. Redonne du tonus au son.

A faire

J'ai prévu également d'utiliser la FFT (Fast Fourier Transform) afin de pouvoir jouer sur les fréquences. Le problème est que mon programme fonctionne actuellement en 16 bits, et le processeur à 200 Mhz que j'utilise actuellement n'arrive pas à calculer la FFT assez rapidement. Il faudrait que j'arrive à me servir de la carte son en mode 32 bits protégé grâce à FreePascal, mais je n'y suis pas encore arrivé, malgré quelques codes sources trouvés sur Internet ([1] et [2]).

Problèmes rencontrés

Je ne sais pas si c'est le water cooling du processeur ou bien un bug subtil dans le programme, mais quelques fois, le programme plante et s'arrête immédiatement. Il faut alors le relancer pour que tout refonctionne (j'ai créé un fichier .BAT qui le fait pour moi). A priori, ce bug apparaît lorsque le noise gate est activé (cela explique un peu mieux l'erreur : une "division par zéro"). Aussi, de temps en temps, on peut entendre des grésillements, comme si le programme prenait du retard. Il faudra que je regarde d'où cela peut venir (je pense à la différence de fréquences entre cartes sons, qui ne sont pas toutes les deux exactement à 44100 Hz).

Aussi, dans le fichier source principal, il y a une directive $M au début, et une valeur qui ressemble à 3601 juste après. Je ne sais pas pourquoi, mais à chaque fois que j'ajoute du code, il faut que je diminue cette valeur, sinon il se produit des bruits affreux. Et si la valeur est trop faible, j'entends des craquements dans le son.

Voir aussi

  • (en) http://www.mwyann.info/sb16/ : Page actuelle décrivant le projet, code source disponible.
  • (en) Vidéo sur Youtube montrant le programme en fonctionnement.
  • (en) SoundBlaster.pdf : Documentation sur le fonctionnement des cartes ISA Sound Blaster, dont je me suis servi pour développer mes unités de lecture/enregistrement.