- Riviera Audio
- Technique
- 2362 Vues
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:
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:
Le lancement va s'interrompre, ce qui est normal, avec un retour proche de cela:
Internal resolution is 32 bit floating point.
No inputs defined.
Editez maintenant le fichier "~/.brutefir_config":
Modifiez votre fichier exactement comme suit, en remplaçant les valeurs en gras par celles correspondant à votre configuration:
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
};
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
};
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
};
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:
Imaginons que votre périphérique de sortie est le suivant:
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é:
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:
Ajoutez la ligne suivante à la fin:
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:
Ajoutez la ligne suivante à la fin:
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:
Dans le résultat de la commande, vérifiez la présence de "snd_aloop", comme dans cet exemple:
Vérifiez ensuite que les périphériques de loopback sont bien créés, et avec le bon nom. Entrez la commande:
Le résultat doit être:
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:
Ajoutez cette ligne avant la fin du fichier en remplaçant "votreutilisateur" par le nom de votre utilisateur:
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:
Observez le retour de la commande:
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é