Tutoriel: installation de Cantata/mpd/BruteFIR - Lecture de musique dématérialisée et "room correction" open source - Partie 2/2

 

Nous allons maintenant nous attaquer à l'installation et à la configuration de bruteFIR, puis nous créerons la liaison qui passera votre flux audio de mpd à BruteFIR, qui lui même enverra le tout, filtré, vers votre carte son. Pour finir, quelques conseils concernant le "room correction" basés sur notre modeste expérience.

 

2. BruteFIR

2.1 Installation

BruteFIR est disponible dans les dépôts Ubuntu, donc l'installation est très simple, entrez les commandes suivantes dans un terminal:

sudo apt-get update

sudo apt-get install brutefir

 

2.2 Configuration

BruteFIR possède deux fichiers de configuration, "~/.brutefir_defaults" et "~/.brutefir_config".

Nous allons placer notre configuration dans ".brutefir_config", ce dernier étant lu en dernier il prend donc le pas sur la configuration se trouvant dans ".brutefir_defaults". Ce dernier comme son nom l'indique abrite les options de configuration par défaut.

Il faut tout d'abord lancer BruteFIR une première fois pour que celui-ci créé les fichiers de configuration, entrez la commande suivante:

brutefir

Le lancement va s'interrompre, ce qui est normal, avec un retour proche de cela:

BruteFIR v1.0m (November 2013)                                (c) Anders Torger

Internal resolution is 32 bit floating point.
No inputs defined.

Editez maintenant le fichier "~/.brutefir_config":

vim ~/.brutefir_config

Modifiez votre fichier exactement comme suit, en remplaçant les valeurs en gras par celles correspondant à votre configuration:

float_bits: 32;             # précision interne en bits
sampling_rate: 44100;       # taux d'echantillonage en Hz (doit être identique à celui de vos filtres)
filter_length: 8192,8;      # longueur des filtres = premier chiffre x deuxième chiffre (ici 65536)
overflow_warnings: true;
show_progress: false;
max_dither_table_size: 0;   # taille max en bytes de dither pré-calculé
allow_poll_mode: false;
modules_path: ".";          # répertoire vers modules BruteFIR additionnels
monitor_rate: false;
powersave: false;           # mettre en pause le filtrage si pas d’entrée
lock_memory: true;          # activer lock memory si realtime prio est configuré
sdf_length: -1;
safety_limit: 20;
convolver_config: "~/.brutefir_convolver";

#####configuration riviera audio#####

coeff "eq" {
    format: "TEXT";                                  # format de votre filtre, ici un fichier .txt
    filename: "/chemin/vers/votrefiltre.txt";        # chemin vers votre filtre
};
#entree venant de mpd via l'interface de loopback
input "rightin", "leftin" {
    device: "alsa" { device: "hw:CARD=brutefirloop,DEV=1"; ignore_xrun: true; }; # entrée via interface de loopback
    sample: "S16_LE";   # format d’entrée, identique à ce que vous avez mis en format de sortie dans mpd.conf
    channels: 2/0,1;    # nombre de canaux / lesquels utiliser (numérotés à partir de 0)
    delay: 0,0;         # délai en échantillons pour chaque canal
    maxdelay: -1;       # délai max
};
#sortie vers votre carte son ou DAC externe
output "rightout", "leftout" {
    device: "alsa" { device: "hw:1,0"; ignore_xrun: true; };  # sortie vers votre carte son
    sample: "S16_LE";   # format de sortie
    channels: 2/0,1;    # nombre de canaux / lesquels utiliser (ici deux canaux)
    delay: 0,0;         # délai en échantillons pour chaque canal
    maxdelay: -1;       # délai max
    dither: true;       # activer ou non le dither
};
#filtrage des canaux droits et gauches, ajouter des blocs si plus de canaux
filter "leftfilter" {
    from_inputs: "leftin"/0.0;
    to_outputs: "leftout"/0.0;
    coeff: "eq";
    delay: 0;
    crossfade: false;
};

filter "rightfilter" {
        from_inputs: "rightin"/0.0;
        to_outputs: "rightout"/0.0;
        coeff: "eq";
        delay: 0;
        crossfade: false;
};

"sample" dans les blocs "input" et "output" correspond au nombre de bits de votre flux audio, les valeurs les plus courantes sont:

  • S16_LE: format 16 bits le plus répandu (CD)
  • S24_3LE: format 24bits sur 3 octets
  • S24_LE: format 24bits sur 4 octets (padded)
  • S32_LE: format 32 bits le plus répandu

Attention: La valeur choisie doit être supportée par votre périphérique de sortie audio (DAC, carte son...) !

La ligne "device: "alsa" { device: "hw:1,0"; ignore_xrun: true; };" est très importante. Elle indique à BruteFIR quel périphérique utiliser comme sortie son. Remplacez "hw:1,0" par votre périphérique de sortie.

Pour lister vos périphériques ALSA, utilisez la commande:

aplay -l

Imaginons que votre périphérique de sortie est le suivant:

carte 2: HDMI_1 [HDA ATI HDMI], périphérique 8: HDMI 2 [HDMI 2]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0

Il s'agit de la carte 2 et du périphérique 8, vous écrirez donc: "device: "alsa" { device: "hw:2,8"; ignore_xrun: true; };".

La configuration de BruteFIR est terminée, sauvegardez et quittez l'éditeur de texte.

 

2.3 Filtrage de plusieurs canaux indépendamment (optionnel)

Dans notre fichier de configuration, le même filtrage est appliqué aux deux canaux, si vous souhaitez par exemple filtrer 2 enceintes indépendamment, vous devrez créer 2 blocs "coeff" en tout, avec des noms différents et un chemin vers 2 filtres différents.

Il faudra aussi 2 blocs "filter", utilisant chacun le "coeff" adéquat.

Voici un exemple des blocs "coeff" et "filter" pour filtrer 2 voies séparément, le reste de la configuration est inchangé:

coeff "eqleft" {
    format: "TEXT";
    filename: "/chemin/vers/monfiltregauche.txt";
};

coeff "eqright" {
    format: "TEXT";
    filename: "/chemin/vers/monfiltredroit.txt";
};

filter "leftfilter" {
    from_inputs: "leftin"/0.0;
    to_outputs: "leftout"/0.0;
    coeff: "eqleft";
    delay: 0;
    crossfade: false;
};

filter "rightfilter" {
        from_inputs: "rightin"/0.0;
        to_outputs: "rightout"/0.0;
        coeff: "eqright";
        delay: 0;
        crossfade: false;
};

Le principe est le même quelque soit le nombre de canaux, BruteFIR étant très efficient en termes de ressources, un PC moderne devrait vous permettre de filtrer des dizaines de canaux séparément, et ce même avec des filtres relativement longs.

 

3. Interface de loopback

Maintenant que mpd et BruteFIR sont configurés, vous aurez peut-être noté quelques apparitions du terme "loopback" au cours de ce tutoriel. Mais qu'est-ce donc ? il s'agit simplement d'une interface sonore de loopback, c'est à dire, pour simplifier, une boucle qui peut capter votre flux audio et le restituer. Cette carte son virtuelle que nous allons créer comporte des périphériques d'entrée, pour injecter le flux, et de sortie, pour le récupérer.

D'autres solutions existent pour transférer le flux audio de mpd vers BruteFIR, mais l'interface de loopback nous semble idéale car à la fois simple à mettre en place, fiable et efficace. Pour information, d'autres possibilités seraient par exemple d'utiliser un pipe vers stdin (peu fiable, pas fait pour gérer un flux audio, latence voir plantage sur certaines configurations) ou le logiciel JACK (excellent mais utile surtout pour gérer de nombreuses connexions, ici cela reviendrait à utiliser une multiprise avec 32 prises pour brancher un seul appareil).

 

3.1 Chargement et configuration du module snd_aloop

Le module snd_aloop sert à créer des interfaces de loopback virtuelles, nous avons besoin de ce dernier, l'idéal étant qu'il soit chargé au démarrage. Pour cela ouvrez le fichier "/etc/modules" avec sudo:

sudo vim /etc/modules

Ajoutez la ligne suivante à la fin:

snd_aloop

Sauvegardez et quittez.

Le module sera désormais chargé au démarrage de Linux.

Par défaut le module créé 8 périphériques alors que nous n'en voulons qu'un. Ouvrez le fichier "/etc/modprobe.d/alsa-base.conf", toujours avec sudo:

sudo vim /etc/modprobe.d/alsa-base.conf

Ajoutez la ligne suivante à la fin:

options snd-aloop  index=10 id=brutefirloop enable=1 pcm_substreams=1

Ainsi un seul périphérique sera créé (un d'entrée et un de sortie en réalité). Au passage nous avons aussi donné un nom fixe à cette boucle qui nous permet de la retrouver facilement.

Sauvegardez, fermez l’éditeur et redémarrez votre Linux.

 

3.2 Vérifications

Maintenant, nous allons vérifier que le module s'est bien chargé au démarrage avec la commande suivante:

lsmod | grep snd_aloop

Dans le résultat de la commande, vérifiez la présence de "snd_aloop", comme dans cet exemple:

snd_aloop              28672  2

Vérifiez ensuite que les périphériques de loopback sont bien créés, et avec le bon nom. Entrez la commande:

aplay -l | grep brutefir

Le résultat doit être:

carte 10: brutefirloop [Loopback], périphérique 0: Loopback PCM [Loopback PCM]
carte 10: brutefirloop [Loopback], périphérique 1: Loopback PCM [Loopback PCM]

Si tout est correct, vous pouvez passer à la suite.

 

4. Autoriser la priorité realtime

Cette étape permet à BruteFIR d'utiliser la priorité realtime, ce qui peut améliorer la latence.

Éditez le fichier "/etc/security/limits.conf" avec sudo:

sudo vim /etc/security/limits.conf

Ajoutez cette ligne avant la fin du fichier en remplaçant "votreutilisateur" par le nom de votre utilisateur:

@votreutilisateur        -    rtprio        99

Fermez votre session et reconnectez vous pour que le changement soit pris en compte.

 

5. Mise en route

Il est maintenant temps de tester votre installation.

Démarrez tout d'abord BruteFIR avec la commande:

brutefir

Observez le retour de la commande:

BruteFIR v1.0m (November 2013)                                (c) Anders Torger

Internal resolution is 32 bit floating point.
SSE capability detected -- optimisation enabled.
Creating 4 FFTW plans of size 16384...finished.
Loading coefficient set...finished.
Dither table size is 882001 bytes.
Generating random numbers...finished.
Realtime priorities are min = 2, usermax = 1, mid = 3 and max = 4.
Estimated CPU clock rate is 3392.146 MHz. CPU count is 8.
Filters in process 0: 0
Filters in process 1: 1
Realtime priority 4 set for filter process (pid 21618)
Realtime priority 4 set for filter process (pid 21619)
Realtime priority 3 set for input process (pid 21617)
Realtime priority 3 set for output process (pid 21620)
Fixed I/O-delay is 16384 samples
Audio processing starts now

Ce dernier doit se finir par "Audio processing starts now", cela signifie que BruteFIR est démarré et attend de passer aux choses sérieuses !

Vérifiez aussi la présence des lignes de type "Realtime priority x set for xxxxx process (pid xxxxx)", elles signifient que BruteFIR utilise bien la priorité realtime.

Lancez maintenant Cantata (via le menu démarrer) et essayez de lire une piste audio, vous devriez maintenant pouvoir profiter du résultat.

 

6. Dépannage et conseils

Si vous avez bien suivi ce tutoriel, vous devriez maintenant avoir un système fonctionnel, si ce n'est pas le cas voici quelques pistes.

Vous n'avez pas de crash mais aucun son ne sort :

  • L'interface de sortie dans mpd.conf est-elle bien celle de loopback côté entrée ?
  • Le format de sortie dans mpd.conf est-il supporté par l'interface de loopback ?
  • BruteFIR est-il bien démarré ? (on ne sait jamais !)
  • Format de sortie mpd.conf = format d'entrée bruteFIR = format du filtre FIR utilisé ?
  • Le format de sortie configuré dans bruteFIR est-il supporté par votre DAC/carte son ?

Si bruteFIR ne se lance pas:

  • Le filtre utilisé est-il bien renseigné (format, chemin...) ?
  • Le format de sortie de brute FIR est-il supporté par votre DAC/carte son ?
  • Votre utilisateur a-t-il le droit d'utiliser la priorité realtime ?

En cas de lag dans Cantata (si vous cliquez sur lecture, pause ou autre le logiciel met plusieurs secondes à réagir):

  • Vérifiez que toutes les valeurs "delay" et "maxdelay" sont bien configurées dans bruteFIR
  • Essayez de fractionner "filter_length", par exemple mettre 8192,8 au lieu de 65536

Pour finir, n'oubliez pas que l'utilisation du "room correction" peut potentiellement, en cas de mauvaise manipulation, endommager votre équipement. Vérifiez tout plusieurs fois quand vous créez et utilisez vos filtres ! Comme sécurité supplémentaire, il convient au moins de remettre le volume de votre amplificateur au minimum à chaque nouvel essai d'une modification apportée.

Bonne écoute !





Mise à jour 04/02/2024:

- Correction de l'exemple de fichier brutefir_config, inversion des termes leftout et rightout

- Essai sous Ubuntu 20.04.6 LTS à jour validé

Ce site utilise des cookies. En continuant votre navigation sur celui-ci, vous acceptez notre politique de confidentialité.