MultiSpace3D est un spatialiseur 3D essentiellement pour Linux. Il repose sur une API générée à partir des exemples fournis sur le site consacré au langage Faust du Grame.
Attention, cette nouvelle version n'est pas compatible avec la version 0.2 du space3D64 , en raison de modification profonde de conception.
Le principe de base est de disposer d’un outil permettant de placer des objets audios statiques ou dynamiques dans l’ espace 3D d’un studio, d’une salle de concert ou d’un acousmonium.
S’il existe de nombreux outils pour Windows et OSX, Linux n’a pas encore vraiment investi ce domaine. Pourtant, l’écriture de l’espace sonore, que ce soit pour une diffusion traditionnelle (concert) ou pour des installations, constitue un champ d’expérimentation extraordinaire qui convoque toutes nos connaissances sur le son.
MultiSpace3D propose une interface qui vise à simplifier la manipulation des données et leur représentation afin d’encourager les compositeurs à enrichir leurs pratiques. Elle repose sur des fenêtres de modélisation 2D et une fenêtre de visualisation 3D OpenGl. L’interface est indépendante des moteurs audios, et communique avec eux grâce au protocole OSC des DAW . Ceux-ci peuvent intégrer les utilitaires LV2 ou VST nécessaires aux traitements des fichiers audios en fonction des besoins et des préférences de l’utilisateur.
Cet outil de spatialisation peut permettre de s’abstraire des contraintes de travail local, car il repose pour l'immédiat sur un cube virtuel qui symbolise un espace 3D. Il rend possible l’écriture spatiale dès la conception des objets sonores (maquette), en virtualisant l’espace de projection global pour une projection finale sur un acousmonium comportant beaucoup plus de canaux que son propre studio. Évidemment, cela ne dispensera pas de l’expérimentation en direct, dans le lieu de projection, mais cela facilite la phase de conception en permettant de travailler sur un objet multiphonique qu’il sera toujours possible d’adapter au lieu où il sera réellement produit.
Ce programme repose sur une analyse psychoacoustique des processus sonores et à la manipulation des phénomènes liés à l’espace. En ce sens, les possibilités de configuration des greffons associés à la variation de la distance des sources audios sont totalement fantaisistes, mais très riches en possibilités.
Contrairement à l’ambisonie qui suppose une phase de codage et une autre de décodage en fonction de la destination, nous disposons ici de pistes audios qui intègrent l’ensemble des informations et qu’il est toujours possible d’enregistrer telle quelle.
Pour les configurations les plus complexes, il peut être intéressant d’encoder la piste résultante au format ambisonique au 7e ordre et de l’écouter au casque après un décodage binaural afin d’en contrôler le rendu. À cette fin, il est possible d’utiliser par exemple les outils de la suite IEM (Institute of Electronic Music and Acoustics) ou la suite Sparta de l’université d’Aalto, disponibles toutes les deux pour Linux.
Pour LibraZiK2, vous pouvez charger les binaires ici :
cd (votre dossier de décompression)/multiSpace
sudo make install
Sous Linux, Debian/LibraZiK2, ceci installe le programme dans le répertoire /usr/local. Le programme sera installé dans /usr/local/bin et les fichiers complémentaires dans /usr/local/share. Si vous précisez un dossier, l'installateur copiera les fichiers dans celui-ci en respectant la hiérarchie des dossiers. Le programme se lance en tapant dans un terminal :
/usr/local/bin/multiSpace3D.sh
Je n'ai pas testé pour LibraZiK3.
Au premier lancement, il créera un dossier multiSpace3D dans votre espace utilisateur dans lequel vous trouverez les greffons et le fichier de configuration.
multiSpace3D dépend de SFML 2,4, glm 0,9,8, d’OpenGl et de Liblo que vous devez installer si vous ne l’avez pas déjà fait.
Le programme propose 15 greffons pour Ardour et Reaper aux formats Lv2 et VST :
Auro51, Auro71, Auro91, Auro11, Auro13,micadome, M17, Dominium, NHK222, ZKM23, RfStudio, Ircam, Satosphere, Klangdom, dispositifDb64
Vous pouvez installer ceux qui vous conviennent dans les répertoires correspondants, par exemple ~/.lv2 pour Ardour et ~/.vst pour Reaper. Sous Linux, Reaper ne reconnaît que les vst.
Ces greffons sont indispensables pour le fonctionnement complet de l’application. ils se trouvent dans les dossiers $HOME/space3D/lv2 et $HOME/space3D/vst (vst Linux 64bits)
Ils ont été compilés à partir des sources du Grame pour le langage Faust et sont sous licence BSD.
Les modèles ne sont pas installés automatiquement.
Le script multiSpace3D.sh suppose que le programme est bien installé en /usr/local. Ce script est indispensable, car il transmet des informations de configuration au programme.
Je vous encourage à installer le programme spaceMeter64 pour suivre visuellement l'activité de votre studio en pseudo 3D.
Ce programme est sous licence GNU General Public License. Voir plus loin.
Avant de compiler, vous devez disposer d’un environnement de développement complet.
MultiSpace3D dépend de SFML 2,4, glm 0,9,8, d’OpenGl et de Liblo que vous devez installer si vous ne l’avez pas déjà fait.
Si vous désirez compiler vous même les plugins, vous devrez installer Faust. Les fichiers DSP sont, après le premier lancement de l'application, dans le dossier $HOME/space3D/Plugins/DSP avec l'extension .dsp.
Ces derniers sont indispensables au fonctionnement de l'application.
Dans un terminal, ouvrez le dossier correspondant et tapez les commandes ;
git clone https://github.com/dblanchemain/MultiSpace3D
make all
Make utilise la commande suivante pour compiler :
$(CXX) -std=c++17 -O3 multiSpace3D.cpp -I $(INC) -lstdc++fs -lsfml-graphics -lsfml-window -lsfml-system -llo -lGL -lGLU -lGL -DGL_GLEXT_PROTOTYPES -lpthread `pkg-config ` -o multiSpace3D.bin
Si tout se passe bien vous pouvez finaliser en tapant :
sudo make install
Vous pouvez recompiler multiSpace3D ou spaceCreate individuellement en le précisant après la commande make.
Vous pouvez évidemment modifier le script d’installation s’il ne vous convient pas, mais attention au générateur de script de lancement.
La compilation des Pugins sous Linux se fait simplement :
faust2lv2 -qt4 (nom du plugin).dsp
faust2faustvst -qt4 (nom du plugin).dsp
Pour Linux Debian/LibraZiK2vous pouvez télécharger ces fichiers précompilés sous la forme d'une archive à décompresser dans le dossier /usr/local/share/space3D/Plugins/ et $home/space3D/Plugins/
La compilation sous Windows est identique avec Msys2.MultiSpace3D repose sur des greffons qui rendent possibles une représentation abstraite de l'espace.
Nous avons intégrés des espaces comme le Micadôme, un studio de l'Ircam, le studio 115 de Radio France, etc...afin de compléter les structures plus classique comme le 5.1 ou les espaces Auro3D. Vous trouverez une description de ces structures un peu plus loin.
Ce sont des greffons disponibles au format LV2 ou Vst pour Linux et Windows réalisés en langage Faust du Grame.
Quinze modèles d'espace sont proposés sous la forme de greffons. Chaque greffon propose une entrée et autant de sorties que le modèle d'espace l'exige. Ainsi pour un espace 8 canaux en anneau nous pourrions avoir ceci :
Le code de cette Matrix en langage Faust est très concis. Voici un exemple inspiré du site du Grame:
declare name "matrix";
declare version "1.0";
declare author "Grame";
declare license "BSD";
declare copyright "(c)GRAME 2006";
//-----------------------------------------------
// Audio Matrix : N inputs x M outputs
//-----------------------------------------------
import("stdfaust.lib");
Fader(in) = ba.db2linear(vslider("Input %2in", -96, -96, 1, 0.1));
Mixer(N,out) = hgroup("Output [hidden] %2out", par(in, N, *(Fader(in)) ) :> _ );
Matrix(N,M) = tgroup("Matrix %N x %M", par(in, N, _) <: par(out, M, Mixer(N, out)));
process = Matrix(1, 8);
Pour répondre aux besoins, le programme utilise également une abstraction de l’espace du studio : un cube aux dimensions normalisées (-1, 1) dans les 3 directions avec, au centre, le pupitre ou l'auditeur idéal (sweetspot).
Ce cube a pour mission de permettre la localisation de chaque source audio dans l’espace normalisé.
Dans ce cube, les enceintes sont disposées suivant un schéma correspondant au modèle d'espace choisi. Les tableaux suivants proposent des coordonnées pour les enceintes suivant les configurations de projection.
Le calcul du gain pour chaque sortie se fait relativement à la distance des enceintes.
Dans ce cube, il est supposé que toutes les enceintes ont été calibrées de façon à avoir pour chacune 83 dBSPL à l’écoute pour un bruit rose de -20dB (K-system en K-20) au niveau du pupitre afin que la distance n’intervienne pas ou peu. Voir le document de Jean-Marc Duchenne sur son site : des SONS dans l’air dans la rubrique télécharger.
Il faudra au minimum 8 enceintes disposées sur 2 plans pour bénéficier de la 3D. Si vous placez vos enceintes sur un anneau, vous ne pourrez travaillerez qu’en 2D.
Dès le lancement du programme, un premier objet est placé au centre du cube.
Vous devez cliquer dessus avec le bouton droit de la souris pour changer la piste du séquenceur.
Vous pouvez créer un nouveau mixer en entrant le numéro de la piste dans le champ Track et en cliquant sur le bouton . Si le numémo de piste existe déjà, vous définirez ainsi le curseur courant reconnaissable au cercle blanc externe.
Chaque piste appartient à un groupe défini par sa couleur. Lorsque vous cliquez sur cet icône vous pouvez sélectionner un des 32 groupes :
Ceci permet d’organiser les pistes en groupe que vous pourrez manipuler ensuite selon vos besoins.
Voici un tableau qui résume les options de la barre d'outils :
Permets de récupérer la répartition dans l'espace des objets pour un instant t. Les fichiers se trouvent dans $HOME/space3D/. | |
Permets d'enregistrer la répartition dans l'espace des objets pour un instant t. | |
Permets de lancer une nouvelle instance de multiSpace3D. Ceci peut permettre de gérer indépendamment un groupe d'objets. |
Supprimer une source | Supprimer un groupe | Supprimer toutes les sources | |
Déplacer une source | Déplacer un groupe | Tout déplacer |
Les fonctions disponibles :
Expansion d’un groupe (uniquement si le groupe comporte plusieurs sources) | |
Contraction d’un groupe (uniquement si le groupe comporte plusieurs sources) | |
Rotation Y en fonction du type de déplacement | |
Rotation X en fonction du type de déplacement | |
Rotation Z en fonction du type de déplacemen | |
Fenêtre vue 3D OpenGl | |
Utilitaire de création d'un nouvel espace de projection. |
La touche Del/Suppr permet de supprimer le haut-parleur sélectionné.
Pour les déplacements 3D, la gestion d’un joystick est envisagée.
Pour l’immédiat il faut jongler entre les 4 panneaux de manipulations des sources audios.
Dans la vue 3D OpenGl, il est possible d’assurer la rotation du cube dans toutes les directions avec la souris ou la sphère. Le repère orthonormé permet les translations. La fenêtre n'est pas redimensionnable.
Le menu Préférences ouvre une nouvelle fenêtre qui permet de définir le séquenceur et la configuration OSC.
Quel que soit l'espace associé, les greffons se présentent toujours de la même manière :
Ils sont organisés en deux parties : une première qui permet de spécifier les coordonnées (x,y,z) de l'objet et une deuxième qui concerne des greffons de gestion de la distance.
Les coordonnées sont transmises par OSC par l'interface graphique. Ces coordonnées peuvent évidemment être enregistrées dans le séquenceur par automation.
Ce sont les greffons qui calculent les valeurs des sorties de la Matrix. La formule de calcul est la suivante :
dgain(in, out) = ba.db2linear((-50/tabSpeakerD(out))*dtencGen(in,out));
// pour ces greffons in=1, out peut varier de 5 à 64
// tabSpeakerD contient la distance de l'enceinte au sweetspot
// dtenGen = distance de l'objet à une enceinte, plus l'objet est proche, plus le gain est élevé.
Ce fonctionnement n'altère pas la qualité du son d'origine, mais joue uniquement sur la répartition du gain entre les enceintes de l'espace considéré.
.Les coordonnées des objets peuvent être enregistrés dans les pistes du séquenceur par automation.
Filter | LPF Amp | Ce slider permet de définir l'amplitude de variation de la fréquence de coupure ( de 20 à 20000) | LPF Min | Ce slider permet de définir une valeur minimale pour la coupure LPF | Delay | Feedback | Retour du Delay | Interpolation | Interpolation | MaxTime | Variation maximale du delay (de 0 à 5000) | Freeverb | Damp | Réglage du Damp | RoomSize | Réglage de la dimension de l'espace | Stéréo Spread |
Ces greffons intégrés permettent de renforcer un effet de distance . Ils peuvent être court-circuités si cela est nécessaire.
Les réglages de ces paramètres peuvent être enregistrés dans le séquenceur par automation. Ces greffons modifient évidemment le son.
Le calcul de la distance d'un objet se fait relativement au centre du cube. Plus l'objet est proche du centre du cube, plus sa distance est grande et donc son volume faible. Les paramètres des greffons associés sont ajustés en fonction de la distance.
Les pistes associées du séquenceur doivent être mono.
Dans votre séquenceur vous placez le greffon correspondant à votre studio ou à la disposition que vous souhaitez sur chaque piste mono du projet. Ces pistes disposent alors d'un nombre de sorties correspondant à la variante de votre greffon. Par exemple, avec le greffon ZKM23 vous obtiendrez 23 sorties.
Chaque piste sera alors contrôlable par un mixeur de l'interface graphique dont le numéro correspond à la piste dans le séquenceur.
Toutes les sorties de vos pistes peuvent être routées vers un bus dont le nombre de canaux correspond au nombre de sorties de la variante de votre greffon. Par exemple ici, il s'agira d'un bus 23 canaux.
Vous devez ensuite lancer l'interface du multiSpace3D : multiSpace3D.sh
Il vous appartient ensuite de router les sorties du bus du séquenceur vers votre matériel.
Avec Ardour, il est impératif de court-circuiter le VBAP de chaque piste et du bus, afin que les routages soient bien respectés
En déplaçant un mixeur vous entendrez le son de la piste circuler dans votre espace.
Vous pouvez utiliser plusieurs instances de l'interface multiSpace3D pour simplifier la gestion de l'espace avec des objets complexes.
Si vous désirez utiliser un espace d'un ordre supérieur à votre studio, vous pouvez utiliser un encodage ambisonique d'ordre 7 avec la suite IEM. Vous pouvez alors obtenir un décodage en binaurale écoutable au casque. Mais attention, à partir du moment que vous encodez votre audio en Ambisonie, vous modifiez sa nature.
Dans les tableaux qui suivent, vous disposerez de la liste des numéros de sortie du greffon (M), éventuellement de la dénomination des sorties, des coordonnées retenues pour les enceintes et les numéros des canaux (C) correspondants dans les fichiers audios. Dans le calcul de la position d'un objet, le(s) LFE(s) n'intervien(nen)t pas.
Si, par exemple, vous désirez fournir un fichier audio 5.1, vous devrez ajouter manuellement, dans votre sequenceur, un canal 4 correspondant au LFE aux 5 sorties de l'objMatrix51.
Les numéros du graphisme correspondent aux canaux des fichiers audios pour le 13.1.
Ref : J.M Duchenne Les sons dans l'air
Coord. (x,y,z) | 5.1 | 7.1 | 9.1 | 11.1 | 13.1 | ||||||||
X | Y | Z | M | C | M | C | M | C | M | C | M | C | |
Front Left | -1.0 | -0.18 | 1.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Front Right | 1.0 | -0.18 | 1.0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
Front Center | 0.0 | -0.18 | 1.0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
LFE | 4 | 4 | 4 | 4 | 4 | ||||||||
Surround Left | -1.0 | -0.18 | -1.0 | 4 | 5 | 4 | 5 | 4 | 5 | 4 | 5 | 4 | 5 |
Surround Right | 1.0 | -0.18 | -1.0 | 5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
Side Left | -1.0 | -0.18 | 0.5 | 6 | 7 | 6 | 7 | ||||||
Side Right | 1.0 | -0.18 | 0.5 | 7 | 8 | 7 | 8 | ||||||
Top Front Left | -1.0 | 0.812 | 1.0 | 6 | 7 | 6 | 7 | 8 | 9 | ||||
Top Front Right | 1.0 | 0.812 | 1.0 | 7 | 8 | 7 | 8 | 9 | 10 | ||||
Top Back Left | -1.0 | 0.812 | -1.0 | 8 | 9 | 8 | 9 | 10 | 11 | ||||
Top Back Right | 1.0 | 0.812 | -1.0 | 9 | 10 | 9 | 10 | 11 | 12 | ||||
Top Front Center | 0.0 | 1.0 | 0.812 | 10 | 11 | 12 | 13 | ||||||
Top Center | 0.0 | 1.0 | 0.0 | 11 | 12 | 13 | 14 |
Ref : Auro 3D
M => Numero de sortie de l'objMatrix C => Numéro de canal d'un fichier audio
Les coordonnées définies dans ces tableaux peuvent être modifiées en créant de nouveaux greffons.
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | -1.000 | -0.181 | 0.975 |
2 | 2 | 1.000 | -0.181 | 1.000 |
3 | 3 | 0.007 | -0.181 | 0.985 |
0 | 4 | |||
4 | 5 | -1.000 | -0.181 | -1.000 |
5 | 6 | 0.956 | -0.181 | -1.000 |
6 | 7 | -0.501 | -0.181 | 1.000 |
7 | 8 | 0.501 | -0.181 | 1.000 |
8 | 9 | -0.002 | -0.181 | -1.000 |
9 | 10 | -1.000 | -0.181 | 0.283 |
10 | 11 | 1.000 | -0.181 | 0.283 |
11 | 12 | -0.057 | 1.000 | -0.056 |
12 | 13 | -1.000 | 0.624 | 0.975 |
13 | 14 | -0.007 | 0.624 | 1.000 |
14 | 15 | 1.000 | 0.624 | 1.000 |
15 | 16 | -1.000 | 0.624 | -1.000 |
16 | 17 | 1.000 | 0.624 | -1.000 |
17 | 18 | -0.032 | 0.624 | -1.000 |
Ref : J.M Duchenne Les sons dans l'air
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | -1.000 | -0.181 | 0.990 |
2 | 2 | 1.000 | -0.181 | 1.000 |
3 | 3 | -0.007 | -0.181 | 1.000 |
4 | ||||
4 | 5 | -1.000 | -0.181 | -1.000 |
5 | 6 | 1.000 | -0.181 | -1.000 |
6 | 7 | -0.501 | -0.181 | 0.990 |
7 | 8 | 0.501 | -0.181 | 1.000 |
8 | 9 | 0.002 | -0.181 | -1.000 |
10 | ||||
9 | 11 | -1.000 | -0.181 | 0.288 |
10 | 12 | 1.000 | -0.181 | 0.288 |
11 | 13 | -1.000 | 0.619 | 1.000 |
12 | 14 | 1.000 | 0.619 | 1.000 |
13 | 15 | 0.007 | 0.619 | 1.000 |
14 | 16 | -0.062 | 1.000 | -0.061 |
15 | 17 | -1.000 | 0.619 | -1.000 |
16 | 18 | 1.000 | 0.619 | -1.000 |
17 | 19 | -1.000 | 0.619 | 0.288 |
18 | 20 | 1.000 | 0.619 | 0.283 |
19 | 21 | 0.007 | 0.619 | -1.000 |
20 | 22 | 0.002 | -1.000 | 1.000 |
21 | 23 | -1.000 | -1.000 | 1.000 |
22 | 24 | 1.000 | -1.000 | 1.000 |
Ref : J.M Duchenne Les sons dans l'air
Ref : MICADÔME
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | -0.437 | -0.388 | 0.965 |
2 | 2 | 0.373 | -0.388 | 0.970 |
3 | 3 | -1.000 | -0.388 | 0.399 |
4 | 4 | 1.000 | -0.388 | 0.409 |
5 | 5 | -1.000 | -0.388 | -0.515 |
6 | 6 | 1.000 | -0.388 | -0.515 |
7 | 7 | -0.412 | -0.388 | -1.000 |
8 | 8 | 0.383 | -0.388 | -1.000 |
9 | 9 | -0.793 | 0.412 | 0.242 |
10 | 10 | 0.822 | 0.412 | 0.247 |
11 | 11 | -0.798 | 0.412 | -0.354 |
12 | 12 | 0.802 | 0.412 | -0.348 |
13 | 13 | -0.062 | 0.412 | 0.803 |
14 | 14 | -0.062 | 0.412 | -0.793 |
15 | 15 | -0.244 | 1.000 | -0.056 |
16 | 16 | 0.121 | 1.000 | -0.051 |
0 | 17 | -0.788 | -1.000 | 1.000 |
0 | 18 | 0.802 | -1.000 | 1.000 |
Juste une curiosité. Ce dispositif correspond à la stucture de mon studio.
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | -0.500 | 0.000 | 1.000 |
2 | 2 | 0.500 | 0.000 | 1.000 |
3 | 3 | 0.000 | 0.000 | 1.000 |
4 | 4 | -1.000 | 0.000 | 0.500 |
5 | 5 | 1.000 | 0.000 | 0.500 |
6 | 6 | -1.000 | 0.000 | -0.500 |
7 | 7 | 1.000 | 0.000 | -0.500 |
8 | 8 | -1.000 | 1.000 | 0.500 |
9 | 9 | -1.000 | -1.000 | 1.000 |
10 | 10 | 1.000 | 1.000 | 0.500 |
11 | 11 | 1.000 | -1.000 | 1.000 |
12 | 12 | -1.000 | 1.000 | -0.500 |
13 | 13 | -1.000 | -1.000 | -1.000 |
14 | 14 | 1.000 | 1.000 | -0.500 |
15 | 15 | 1.000 | -1.000 | -1.000 |
16 | 16 | -0.500 | 0.000 | -1.000 |
17 | 17 | 0.500 | 0.000 | -1.000 |
18 | 18 | 0.000 | 1.000 | 0.000 |
Ref : ZKM
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | -0.007 | -0.374 | 1.000 |
2 | 2 | 0.477 | -0.374 | 0.758 |
3 | 3 | 0.590 | -0.374 | 0.061 |
4 | 4 | 0.758 | -0.374 | -0.318 |
5 | 5 | 0.462 | -0.374 | -0.722 |
6 | 6 | 0.007 | -0.374 | -1.000 |
7 | 7 | -0.511 | -0.374 | -0.717 |
8 | 8 | -0.758 | -0.374 | -0.318 |
9 | 9 | -0.753 | -0.374 | 0.268 |
10 | 10 | -0.526 | -0.374 | 0.742 |
11 | 11 | 0.235 | 0.219 | 0.540 |
12 | 12 | 0.610 | 0.219 | 0.162 |
13 | 13 | 0.605 | 0.219 | -0.237 |
14 | 14 | 0.244 | 0.219 | -0.646 |
15 | 15 | -0.185 | 0.219 | -0.646 |
16 | 16 | -0.600 | 0.219 | -0.247 |
17 | 17 | -0.595 | 0.219 | 0.141 |
18 | 18 | -0.180 | 0.219 | 0.535 |
19 | 19 | -0.057 | 0.807 | 0.207 |
20 | 20 | -0.314 | 0.807 | -0.061 |
21 | 21 | -0.052 | 0.807 | -0.354 |
22 | 22 | 0.289 | 0.807 | -0.056 |
23 | 23 | -0.067 | 1.000 | -0.056 |
Ref : IRCAM
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | 0.002 | -0.581 | 0.899 |
2 | 2 | 0.778 | -0.581 | 0.606 |
3 | 3 | 1.000 | -0.581 | 0.000 |
4 | 4 | 0.773 | -0.581 | -0.601 |
5 | 5 | 0.254 | -0.581 | -1.000 |
6 | 6 | -0.274 | -0.581 | -1.000 |
7 | 7 | -0.719 | -0.581 | -0.591 |
8 | 8 | -1.000 | -0.581 | -0.010 |
9 | 9 | -0.714 | -0.581 | 0.601 |
10 | 10 | 0.220 | -0.181 | 0.606 |
11 | 11 | 0.664 | -0.181 | 0.162 |
12 | 12 | 0.669 | -0.181 | -0.273 |
13 | 13 | 0.353 | -0.181 | -0.717 |
14 | 14 | -0.042 | -0.181 | -0.808 |
15 | 15 | -0.506 | -0.181 | -0.697 |
16 | 16 | -0.743 | -0.181 | -0.288 |
17 | 17 | -0.743 | -0.181 | 0.152 |
18 | 18 | -0.398 | -0.181 | 0.586 |
19 | 19 | -0.106 | 0.525 | 0.348 |
20 | 20 | 0.343 | 0.525 | 0.086 |
21 | 21 | 0.235 | 0.525 | -0.429 |
22 | 22 | -0.215 | 0.525 | -0.545 |
23 | 23 | -0.521 | 0.525 | -0.076 |
24 | 24 | -0.106 | 1.000 | -0.146 |
Ref : Radio France
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | -0.585 | -0.374 | 1.000 |
2 | 2 | -0.190 | -0.374 | 1.000 |
3 | 3 | 0.205 | -0.374 | 1.000 |
4 | 4 | 0.605 | -0.374 | 1.000 |
5 | 5 | 1.000 | -0.374 | -0.591 |
6 | 6 | 1.000 | -0.374 | -0.197 |
7 | 7 | 1.000 | -0.374 | 0.197 |
8 | 8 | 1.000 | -0.374 | 0.601 |
9 | 9 | 0.610 | -0.374 | -1.000 |
10 | 10 | 0.210 | -0.374 | -1.000 |
11 | 11 | -0.195 | -0.374 | -1.000 |
12 | 12 | -0.590 | -0.374 | -1.000 |
13 | 13 | -1.000 | -0.374 | -0.591 |
14 | 14 | -1.000 | -0.374 | -0.197 |
15 | 15 | -1.000 | -0.374 | 0.207 |
16 | 16 | -1.000 | -0.374 | 0.601 |
17 | 17 | -0.333 | 0.219 | 1.000 |
18 | 18 | 0.343 | 0.219 | 1.000 |
19 | 19 | 1.000 | 0.219 | -0.394 |
20 | 20 | 1.000 | 0.219 | 0.404 |
21 | 21 | 0.338 | 0.219 | -1.000 |
22 | 22 | -0.323 | 0.219 | -1.000 |
23 | 23 | -1.000 | 0.219 | -0.399 |
24 | 24 | -1.000 | 0.219 | 0.409 |
25 | 25 | -0.402 | 0.807 | -0.056 |
26 | 26 | 0.407 | 0.807 | -0.061 |
27 | 27 | 0.007 | 0.807 | 0.283 |
28 | 28 | 0.002 | 0.807 | -0.404 |
29 | 29 | -0.062 | 1.000 | -0.056 |
Ref : Satosphère
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | -0.062 | 1.000 | -0.061 |
2 | 2 | -0.412 | 0.779 | 0.081 |
3 | 3 | -0.328 | 0.779 | -0.323 |
4 | 4 | 0.002 | 0.779 | -0.449 |
5 | 5 | 0.299 | 0.779 | -0.182 |
6 | 6 | 0.225 | 0.779 | 0.242 |
7 | 7 | -0.131 | 0.779 | 0.384 |
8 | 8 | -0.052 | 0.214 | 0.672 |
9 | 9 | -0.407 | 0.214 | 0.561 |
10 | 10 | -0.689 | 0.214 | 0.359 |
11 | 11 | -0.847 | 0.214 | 0.000 |
12 | 12 | -0.699 | 0.214 | -0.348 |
13 | 13 | -0.422 | 0.214 | -0.581 |
14 | 14 | -0.062 | 0.214 | -0.667 |
15 | 15 | 0.348 | 0.214 | -0.581 |
16 | 16 | 0.635 | 0.214 | -0.333 |
17 | 17 | 0.798 | 0.214 | 0.010 |
18 | 18 | 0.644 | 0.214 | 0.369 |
19 | 19 | 0.358 | 0.214 | 0.596 |
20 | 20 | 0.007 | -0.181 | 1.000 |
21 | 21 | -0.501 | -0.181 | 0.798 |
22 | 22 | -0.872 | -0.181 | 0.414 |
23 | 23 | -1.000 | -0.181 | -0.051 |
24 | 24 | -0.872 | -0.181 | -0.495 |
25 | 25 | -0.506 | -0.181 | -0.793 |
26 | 26 | -0.002 | -0.181 | -1.000 |
27 | 27 | 0.501 | -0.181 | -0.823 |
28 | 28 | 0.872 | -0.181 | -0.460 |
29 | 29 | 1.000 | -0.181 | -0.005 |
30 | 30 | 0.847 | -0.181 | 0.480 |
31 | 31 | 0.511 | -0.181 | 0.904 |
Ref (Anneau elliptique dans un cube): ZKM Klangdom
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | -0.002 | -0.562 | -1.000 |
2 | 2 | -0.585 | -0.562 | -0.914 |
3 | 3 | -1.000 | -0.562 | -0.646 |
4 | 4 | -1.000 | -0.562 | -0.202 |
5 | 5 | -1.000 | -0.562 | 0.237 |
6 | 6 | -1.000 | -0.562 | 0.677 |
7 | 7 | -0.516 | -0.562 | 1.000 |
8 | 8 | -0.002 | -0.562 | 1.000 |
9 | 9 | 0.472 | -0.562 | 1.000 |
10 | 10 | 1.000 | -0.562 | 0.667 |
11 | 11 | 1.000 | -0.562 | 0.354 |
12 | 12 | 1.000 | -0.562 | -0.152 |
13 | 13 | 1.000 | -0.562 | -0.606 |
14 | 14 | 0.442 | -0.562 | -0.737 |
15 | 15 | -0.358 | 0.002 | -0.742 |
16 | 16 | -0.714 | 0.002 | -0.540 |
17 | 17 | -0.699 | 0.002 | -0.207 |
18 | 18 | -0.709 | 0.002 | 0.121 |
19 | 19 | -0.709 | 0.002 | 0.409 |
20 | 20 | -0.506 | 0.002 | 0.672 |
21 | 21 | -0.146 | 0.002 | 0.677 |
22 | 22 | 0.215 | 0.002 | 0.692 |
23 | 23 | 0.600 | 0.002 | 0.702 |
24 | 24 | 0.615 | 0.002 | 0.258 |
25 | 25 | 0.615 | 0.002 | -0.045 |
26 | 26 | 0.610 | 0.002 | -0.384 |
27 | 27 | 0.111 | 0.002 | -0.409 |
28 | 28 | 0.116 | 0.412 | -0.485 |
29 | 29 | -0.254 | 0.412 | -0.571 |
30 | 30 | -0.595 | 0.412 | -0.409 |
31 | 31 | -0.595 | 0.412 | -0.030 |
32 | 32 | -0.570 | 0.412 | 0.303 |
33 | 33 | -0.328 | 0.412 | 0.404 |
34 | 34 | -0.027 | 0.412 | 0.409 |
35 | 35 | 0.264 | 0.412 | 0.354 |
36 | 36 | 0.323 | 0.412 | -0.056 |
37 | 37 | 0.151 | 0.769 | -0.237 |
38 | 38 | -0.091 | 0.769 | -0.354 |
39 | 39 | -0.319 | 0.769 | -0.202 |
40 | 40 | -0.314 | 0.769 | 0.086 |
41 | 41 | -0.086 | 0.769 | 0.247 |
42 | 42 | 0.175 | 0.769 | 0.091 |
43 | 43 | -0.057 | 1.000 | -0.051 |
Vue arrière
Coord.Cartésiennes | ||||
Sorties | Canal | X | Y | Z |
1 | 1 | -0.500 | -1.000 | 1.000 |
2 | 2 | 0.000 | -1.000 | 1.000 |
3 | 3 | 0.500 | -1.000 | 1.000 |
4 | 4 | 1.000 | -1.000 | 1.000 |
5 | 5 | 1.000 | -1.000 | 0.500 |
6 | 6 | 1.000 | -1.000 | 0.000 |
7 | 7 | 1.000 | -1.000 | -0.500 |
8 | 8 | 1.000 | -1.000 | -1.000 |
9 | 9 | 0.501 | -1.000 | -1.000 |
10 | 10 | 0.000 | -1.000 | -1.000 |
11 | 11 | -0.500 | -1.000 | -1.000 |
12 | 12 | -1.000 | -1.000 | -1.000 |
13 | 13 | -1.000 | -1.000 | -0.500 |
14 | 14 | -1.000 | -1.000 | 0.000 |
15 | 15 | -1.000 | -1.000 | 0.500 |
16 | 16 | -1.000 | -1.000 | 1.000 |
17 | 17 | -0.500 | -0.180 | 1.000 |
18 | 18 | 0.000 | -0.180 | 1.000 |
19 | 19 | 0.500 | -0.180 | 1.000 |
20 | 20 | 1.000 | -0.180 | 1.000 |
21 | 21 | 1.000 | -0.180 | 0.500 |
22 | 22 | 1.000 | -0.180 | 0.000 |
23 | 23 | 1.000 | -0.180 | -0.500 |
24 | 24 | 1.000 | -0.180 | -1.000 |
25 | 25 | 0.501 | -0.180 | -1.000 |
26 | 26 | 0.000 | -0.180 | -1.000 |
27 | 27 | -0.500 | -0.180 | -1.000 |
28 | 28 | -1.000 | -0.180 | -1.000 |
29 | 29 | -1.000 | -0.180 | -0.500 |
30 | 30 | -1.000 | -0.180 | 0.000 |
31 | 31 | -1.000 | -0.180 | 0.500 |
32 | 32 | -1.000 | -0.180 | 1.000 |
33 | 33 | -0.500 | 0.620 | 1.000 |
34 | 34 | 0.000 | 0.620 | 1.000 |
35 | 35 | 0.500 | 0.620 | 1.000 |
36 | 36 | 1.000 | 0.620 | 1.000 |
37 | 37 | 1.000 | 0.620 | 0.500 |
38 | 38 | 1.000 | 0.620 | 0.000 |
39 | 39 | 1.000 | 0.620 | -0.500 |
40 | 40 | 1.000 | 0.620 | -1.000 |
41 | 41 | 0.501 | 0.620 | -1.000 |
42 | 42 | 0.000 | 0.620 | -1.000 |
43 | 43 | -0.500 | 0.620 | -1.000 |
44 | 44 | -1.000 | 0.620 | -1.000 |
45 | 45 | -1.000 | 0.620 | -0.500 |
46 | 46 | -1.000 | 0.620 | 0.000 |
47 | 47 | -1.000 | 0.620 | 0.500 |
48 | 48 | -1.000 | 0.620 | 1.000 |
49 | 49 | -0.393 | -1.000 | -0.399 |
50 | 50 | -0.002 | -1.000 | -0.399 |
51 | 51 | 0.402 | -1.000 | -0.399 |
52 | 52 | -0.398 | -1.000 | 0.000 |
53 | 53 | 0.000 | -1.000 | 0.000 |
54 | 54 | 0.407 | -1.000 | 0.000 |
55 | 55 | -0.393 | -1.000 | 0.404 |
56 | 56 | 0.002 | -1.000 | 0.409 |
57 | 57 | 0.407 | -1.000 | 0.409 |
58 | 58 | -0.244 | 1.000 | -0.399 |
59 | 59 | 0.249 | 1.000 | -0.399 |
60 | 60 | -0.383 | 1.000 | 0.010 |
61 | 61 | 0.000 | 1.000 | 0.000 |
62 | 62 | 0.407 | 1.000 | 0.005 |
63 | 63 | -0.225 | 1.000 | 0.404 |
64 | 64 | 0.254 | 1.000 | 0.404 |
Un espace est défini par un ensemble de coordonnées correspondant à la position des enceintes. Il est nécessaire également de définir la distance de l'enceinte au centre du cube.
Ceci nous donne quatre tableaux de variables :
tabSpeakerX(0) = -0.5;
tabSpeakerY(0) = 0.0;
tabSpeakerZ(0) = 1;
tabSpeakerD(0) = 1.11803;
Les coordonnées sont normalisées dans le cube présenté plus haut.
Lorsque vous disposez de l'ensemble des coordonnées de votre espace, il suffit d'intégrer ces coordonnées dans le code DSP du greffon:
Nous allons définir un nouveau greffon pour un espace 10.1. Vous noterez que cet espace est une extension du 9.1 :
declare name "objectMatrix101"; // modifier le nom de votre greffon
declare version "1.0";
declare author "D.Blanchemain";
declare license "BSD";
declare copyright "(c)D.Blanchemain 2020";
import("stdfaust.lib");
Matrix(N,M) =_:filters(1):delay:freeverb(1)<: par(out, M, *(Fader(1,out): si.smoo)) :> par(out, M, _)
with {
// coordonnées à modifier
tabSpeakerX(0) = -1.0;
tabSpeakerY(0) = 0.0;
tabSpeakerZ(0) = 1; // calcul de la distance de l'enceinte au sweetpot
tabSpeakerD(0) = 1.41421; // sqrt((tabSpeakerX(0)*tabSpeakerX(0))+(tabSpeakerY(0)*tabSpeakerY(0))+(tabSpeakerZ(0)*tabSpeakerZ(0)))
tabSpeakerX(1) = 1.0;
tabSpeakerY(1) = 0.0;
tabSpeakerZ(1) = 1;
tabSpeakerD(1) = 1.41421;
tabSpeakerX(2) = 0.0;
tabSpeakerY(2) = 0.0;
tabSpeakerZ(2) = 1;
tabSpeakerD(2) = 1.0;
tabSpeakerX(3) = -1.0;
tabSpeakerY(3) = 0.0;
tabSpeakerZ(3) = -1.0;
tabSpeakerD(3) = 1.41421;
tabSpeakerX(4) = 1.0;
tabSpeakerY(4) = 0.0;
tabSpeakerZ(4) = -1.0;
tabSpeakerD(4) = 1.41421;
tabSpeakerX(5) = -1.0;
tabSpeakerY(5) = -1.0;
tabSpeakerZ(5) = 1.0;
tabSpeakerD(5) = 1.73205;
tabSpeakerX(6) = 1.0;
tabSpeakerY(6) = -1.0;
tabSpeakerZ(6) = 1.0;
tabSpeakerD(6) = 1.73205;
tabSpeakerX(7) = -1.0;
tabSpeakerY(7) = -1.0;
tabSpeakerZ(7) = -1.0;
tabSpeakerD(7) = 1.73205;
tabSpeakerX(8) = 1.0;
tabSpeakerY(8) = -1.0;
tabSpeakerZ(8) = -1.0;
tabSpeakerD(8) = 1.73205;
tabSpeakerX(9) = 0.0; // plafond : coordonnées ajoutées au 9.1
tabSpeakerY(9) = -1.0;
tabSpeakerZ(9) = 0.0;
tabSpeakerD(9) = 1.0;
dtencGen(in, out) = sqrt(pow(tabSpeakerX(out)-x(in),2) + pow(tabSpeakerY(out)-y(in),2) + pow(tabSpeakerZ(out)-z(in),2));
dgain(in, out) = ba.db2linear((-50/tabSpeakerD(out))*dtencGen(in,out));
x(i) = hslider("/X%i",0,-1,1,0.01);
y(i) = hslider("/Y%i",0,-1,1,0.01);
z(i) = hslider("/Z%i",0,-1,1,0.01);
Fader(in,out)= vgroup("[1]Input %2in",dgain(in,out));
cdistance(in)=sqrt(pow(0-x(in),2) + pow(0-y(in),2) + pow(0-z(in),2));
paramDistance(x)=hgroup("[2]Distance",x);
//-----------------------------------------------------------
// LPF
//-----------------------------------------------------------
minfreq=paramDistance(vslider("LPF Min",100, 20, 2000, 1));
ampfreq=paramDistance(vslider("LPF Amp",5000, 20, 19980, 1));
rpf(in)=minfreq+(ampfreq*min(1,cdistance(in))):floor;
LPF(in)=fi.lowpass(3,rpf(in));
fbp = checkbox("[0] Bypass [tooltip: When this is checked, the filters has no effect]");
filters(in)=paramDistance(vgroup("FILTERS",ba.bypass1(fbp,hgroup("[1]",LPF(in)))));
//----------------------------------------------------------
// Delay
//----------------------------------------------------------
delay_group(x) = paramDistance(vgroup("[2]DELAY", x));
cbp =delay_group(vgroup("[0]",checkbox("Bypass [tooltip: When this is checked, Delay
has no effect]")));
voice = delay_group(vgroup("[1]",(+ : de.sdelay(N, interp, dtime)) ~ *(fback)));
N = int(2^19);
interp = hslider("interpolation[unit:ms][style:knob]",10,1,100,0.1)*ma.SR/1000.0;
//dtime = hslider("delay[unit:ms][style:knob]", 0, 0, 5000, 0.1)*ma.SR/1000.0;
maxtime = hslider("maxtime[style:knob]",100,0,5000,0.1);
fback = hslider("feedback[style:knob]",0,0,100,0.1)/100.0;
dtime = maxtime-(maxtime*min(1,cdistance(1))*ma.SR/1000.0);
delay = ba.bypass1(cbp,voice);
//------------------------------------------------------------
// freeverb
//------------------------------------------------------------
scaleroom = 0.28;
offsetroom = 0.7;
allpassfeed = 0.5;
scaledamp = 0.4;
fixedgain = 0.1;
origSR = 48000;
g=1-((1/1.73205)*min(1.73205,cdistance(1)));
freeverbMono=_<: (*(g)*fixedgain :re.mono_freeverb(combfeed, allpassfeed, damping, spatSpread)),*(1-g):> _;
parameters(x) = paramDistance(hgroup("[3]Freeverb",x));
knobGroup(x) = parameters(vgroup("[1]",x));
fvbp = knobGroup(checkbox("[0] Bypass [tooltip: When this is checked, the freeverb
has no effect]"));
damping = knobGroup(vslider("[1] Damp [style: knob] [tooltip: Somehow control the
density of the reverb.]",0.5, 0, 1, 0.025)*scaledamp*origSR/ma.SR);
combfeed = knobGroup(vslider("[2] RoomSize [style: knob] [tooltip: The room size
between 0 and 1 with 1 for the largest room.]", 0.5, 0, 1, 0.025)*scaleroom*
origSR/ma.SR + offsetroom);
spatSpread = knobGroup(vslider("[3] Stereo Spread [style: knob] [tooltip: Spatial
spread between 0 and 1 with 1 for maximum spread.]",0.5,0,1,0.01)*46*ma.SR/origSR
: int);
freeverb(in) = ba.bypass1(fvbp,freeverbMono);
};
process = Matrix(1,10); // le deuxième chiffre permet de définir la dimension de votre espace : ici 10.
Vous pouvez éditer ce document dans votre éditeur préféré et l'enregister dans votre dossier $HOME/space3D/Plugins. Vous pouvez ensuite importer ce fichier dans faustIDE. Ensuite cliquez sur Run pour le tester. Si tout va bien vous pouvez générer les greffons au format LV2 et/ou VST pour votre système en cliquant sur dans l'IDE.
Voici le diagramme du greffon obtenu pour un objMatrix51 :
SpaceCreate est un utilitaire pour faciliter la conception d'un nouvel espace de projection haut parlant.
En sauvegardant le nouvel espace que vous avez créé, vous pouvez disposer d'un fichier rassemblant les coordonnées des hauts-parleurs, mais aussi d'un tableau au format HTML afin de pouvoir l'intégrer dans une documentation. Il propose également la génération du greffon correspondant sous la forme d'un fichier DSP, qui peut être directement chargé dans faustIDE pour compilation. Ces fichiers sont disponibles dans $home/space3D/Studios
Pour créer un nouvel espace, vous devez procéder par plan. Il est indispensable de disposer d'au moin un plan :
Pour sélectionner un plan, il suffit de cliquer sur le cadre correspondant.
En cliquant avec le bouton gauche sur le quadrillage, vous pouvez insérer un haut-parleur. La touche Del/Suppr permet de le supprimer. Vous ne pouvez voir dans le quadrillage que les hauts-parleurs définis pour le plan actif. Vous pouvez toujours repositionner les hauts-parleurs en les glissant sur le quadrillage. Le point de référence se situe à l'angle haut gauche de l'icône. Les valeurs des coordonnées apparaissent dans le tableau.
Ce tableau permet le tri des coordonnées par les numéros de sortie du greffon, les numéros de canaux ou par plan. Vous pouvez renuméroter manuellement les sorties et les canaux en saisissant les valeurs dans les cases correspondantes.
Si vous cliquez sur le repère 3D, vous obtiendrez une nouvelle fenêtre qui vous proposera une représentation 3D OpenGl. Vous pouvez faire tourner le repère en déplaçant la souris, bouton gauche enfoncé.
Cette fenêtre est importante, car elle permet de vérifier la cohérence de la structure de l'espace.
Ouverture du fichier dont le nom figure sur la ligne en dessous sans extension. | |
Enregistrement du nouvel espace (fichier des coordonnées et fichier html). | |
Génération du fichier DSP pour faustIDE | |
Ouverture de la vue 3D OpenGl. |
Le bouton All permet de visualiser tous les hauts-parleurs. Par défaut, vous ne voyez que les hauts-parleurs du plan actif.
Avec cet outil vous pouvez modifier tous les greffons qui se trouvent dans votre dossier $home/space3D/DSP. Si vous désirez retrouver la version original d'un greffon que vous avez modifié vous pouvez toujours le recopier dans votre dossier à partir de /usr/local/share/space3D/Plugins/DSP
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; If not, see http://www.gnu.org/licenses.
EXCEPTION : matrix license : "BSD".