La reverb a convolution ambisonique avec Jconvolver et NON-mixer

Pré-requis

Ici nous utiliserons l'IR "stalbans_a_wxyz.wav" qui est disponible à cette adresse : http://www.openairlib.net/auralizationdb/content/lady-chapel-st-albans-cathedral
Le .conf est disponible ici

Concept

Les plugins de spatialisation ambisoniques habituels permettent le déplacement dans l'espace autour de l'auditeur, mais sans la notion de profondeur.
Le plugin "Spatializer" compris dans Non-Mixer permet l'envoi du son encodé en ambiphonie vers une reverb ambiphonique, qui permet de simuler la distance qui sépare la source sonore de l'auditeur. Une fois inseré dans la piste audio (monophonique) de Non-mixer, celle-ci gagne huit sorties :

  • 3 "out", pour arriver aux quatres (WXYZ) d'une piste ambisonique de 1er ordre
  • 4 "Early reverb", pour les canaux WXYZ de la reverb, destinés aux premières reflections de l'impulse response. Ces reflections déterminent la "taille de la pièce" et la position de la source dans celle-ci.
  • 1 "Late reverb", qui est un envoi constant pour la reverb diffuse.

La configuration de Jconvolver se fera donc en deux sections, early reflection et tail (ou late) reverb, ce qui permet de traiter indépendamment les deux parties de la reverb.

Pour illuster, voici une session basique. En guise d'entrée, un signal mono arrivant de Non-timeline est routée vers la tranche "Cello" de Non-Mixer. Y est inséré post-fader le plugin Spatializer. Ses sorties directes (Out 1, 2, 3 et 4, soit WXYZ) sont routés vers la tranche "Master". Les sorties Reverb arrivent dans Jconvolver.
Pour cet exemple, le décodeur ambiphonique Amdec est lancé avec le preset "Square" et sort donc sur quatre sorties physiques.

Screenshot de la session

La configuration de Jconvolver

Voici donc notre impulse response en B-format :

Impulse response

En zoomant nous voyons donc l'impulse originale, les premières reflections (early reflections), puis la reverb diffuse (tail ou late reverb).

Détail de l'impulse reponse

Dans notre fichier de config, après avoir renseigné le dossier dans lequel est notre IR (champ /cd), nous passons au champ /convolver/newpour lequel nous indiquons 5 entrées, 4 sorties, une partition de 512 échantillons, et une taille maximum de convolution de 200000 échantillons.
La taille de la partition dépendra de la taille de l'IR, et la taille maximum de convolution devra être plus grande que la taille de l'IR, sous peine de couper la queue de reverb.

C'est ensuite la configuration des entrées/sorties. Comme nous l'avons vu, il nous faut 5 entrées :

----- Numéro de l'entrée / Nom de l'entrée
/input/name       1       In.Tail
/input/name       2       In.W
/input/name       3       In.X
/input/name       4       In.Y
/input/name       5       In.Z

Et 4 sorties :

/output/name      1       Out.W
/output/name      2       Out.X
/output/name      3       Out.Y
/output/name      4       Out.Z

Cette configuration ne devrait pas changer, quel que soit l'IR utilisée.

Les champs /impulse/readsont divisés en deux parties, les early reflections et la reverb diffuse, et sont constitués comme suit :

Partie Early reflections :

#               in out  gain  delay  offset  length  chan      file  
# ---------------------------------------------------------------------
/impulse/read    2   1   0.5    192    461    344       1    stalbans_a_wxyz.wav
/impulse/read    3   2   0.5    192    461    344       2    stalbans_a_wxyz.wav
/impulse/read    4   3   0.5    192    461    344       3    stalbans_a_wxyz.wav
/impulse/read    5   4   0.5    192    461    344       4    stalbans_a_wxyz.wav

L'entrée 2 (In.W) sera traitée avec le canal 1 (W) de l'impulse, puis sortira sur la sortie 1 de Jconvolver (Out.W).
Puisqu'on ne s'occupe là que des early reflections, l'offset correspond au début de la première reflection, en nombre d'échantillons depuis le debut du fichier.
Le delay correspond au nombre d'echantillons entre le début du son direct de l'impulse et la première reflection.
Le length correspond quant à lui à la longueur des early reflections, c'est donc le nombre d'echantillons séparant le début de la première reflection et le début de la reverb diffuse.
Le champs gain est a modifier en cas d'IR non normalisée, ou si l'on veut équilibrer la réponse spaciale.

Partie late reverb :

#               in out  gain  delay  offset  length  chan      file  
# ---------------------------------------------------------------------
/impulse/read    1   1   0.5   506     805    0   1   stalbans_a_wxyz.wav
/impulse/read    1   2   0.5   506     805    0   2   stalbans_a_wxyz.wav
/impulse/read    1   3   0.5   506     805    0   3   stalbans_a_wxyz.wav
/impulse/read    1   4   0.5   506     805    0   4   stalbans_a_wxyz.wav

Ici l'entrée 1 (tail reverb) sera traitée avec les canaux W, X, Y et Z et sortira sur chacune de ces sorties.
L'offset correspond à l'offset plus le length de la partie early reflection.
Le delay correspond au delay plus le length de la partie early reflection également.

Dans les deux parties, on modifiera les champs file et channel si l'on utilise de multiples fichiers d'IR stereo, ou mono.

Il ne nous reste plus qu'à sauvegarder le fichier et lancer jconvolver dans un terminal :

$jconvolver '/chemin/vers/votre/fichier.conf'

ou via Nsm-Proxy :
Executable : jconvolver
Argument : '/chemin/vers/votre/fichier.conf'

Remarques

  • L'unité de temps dans la config étant l'échantillon, tout resampling de l'impulse response demande modification de la configuration.
  • Certaines fois, Jconvolver réagit mal au silence, en chargant le CPU pour rien. L'idéal est donc qu'il ait toujours un peu de son à se mettre sous la dent.