Aller au contenu

Son 360

EirLab dispose d’un système de son composé de 10 enceintes permettant de faire de la spatialisation sonore. Ce projet a été possible entre autre avec la contribution du SCRIME: un grand merci à Gael Jaton et Thibaud Keller!

Matériel

Le système se compose de:

Setup

Tout d’abord il faut configurer correctement la carte son Scarlett 18i20. Passage obligé sous Windows et Focusrite Control. Dans les presets il faut choisir « Direct Routing », et dans la configuration de la carte (petite roue) selectionner « All » pour « Monitor Control ». Cela permet de contrôler le volume à l’aide du bouton monitor en façade: penser à vérifier qu’il n’est pas à zéro! La configuration de la carte est persistante, on peut maintenant passer sous Linux.

Sous linux, il faut créer le fichier /etc/modprobe.d/scarlett.conf avec la ligne suivante dedans:

options snd_usb_audio device_setup=1

Redémarrer linux.

Après démarrage de ubuntu studio

Par défaut, c’est pulse audio qui gère le son. La gestion du son sous Linux se compose de plusieurs couches: les drivers noyau, le système alsa et au dessus des gestionnaires dont pulse audio ou jackd. Ainsi, la plupart des logiciels envoie leurs sons à pulseaudio qui transmet à la bonne carte son. C’est le lorsque l’on joue une vidéo youtube par exemple. pavucontrol permet de voir les cartes et d’affecter celles-ci aux logiciels utilisateurs de son.

Pour pouvoir gérer les 10 enceintes, on doit utiliser le gestionnaire jackd, plus précis que pulseaudio. Seulement, si pulseaudio est lancé, jackd ne pourra pas accéder aux cartes son. Dans un terminal, utiliser la commande suivante pour stopper pulseaudio (note: la commande pulseaudio -k ne marchera pas car le système relancera automatiquement le service):

systemctl --user stop pulseaudio.socket && systemctl --user stop pulseaudio.service


Maintenant que pulseaudio est éteint, vous pouvez lancer qjackctl depuis un terminal. Dans « Setup », choisissez l’interface USB puis fermer le setup et lancer le serveur jackd en cliquant sur « start ». Vous pouvez cliquer sur « connect » pour afficher les entrées et sorties audio actuellement connues et gérée par jackd. Normalement, dans Audio, il doit y avoir à gauche « system » avec 20 entrées et à droite « system » avec 20 sorties. Les 10 premières sorties correspondent aux 10 enceintes.

Pour ajouter la carte son interne à jackd vous devez utiliser les commandes shell « alsa_in » et « alsa_out ». Si vous voulez par exemple pouvoir utiliser les entrées micros:

alsa_in -d hw:0

Si vous voulez pouvoir sortir du son via la carte interne:

alsa_out -d hw:0


Une fois que vous avez donner à jackd l’ensemble des périphériques que vous souhaitez qu’il gère, vous pouvez relancer pulseaudio:

systemctl --user start pulseaudio.socket && systemctl --user start pulseaudio.service

L’outil « pavucontrol » vous montrera les cartes encore « disponibles » ainsi que des entrées et sorties jackd. Vous pouvez donc jouer un son sous firefox, celui-ci ira vers jackd et grace au « connect » de « qjackctl » vous pourrez rediriger le son vers une ou plusieurs enceintes.

La spatialisation avec SuperCollider et Mosca

Installation

Pour l’installation de SuperCollider, nous avons utilisé les paquets ubuntu:

sudo apt-get install supercollider supercollider-common supercollider-dev supercollider-emacs supercollider-ide supercollider-language supercollider-server supercollider-supernova sc3-plugins sc3-plugins-language sc3-plugins-server


Pour Mosca, il suffit de suivre les « instructions » : https://github.com/escuta/mosca

Paramétrage:


Utiliser la commande shell « scide » pour lancer l’IDE de SuperCollider. Dans cet IDE, une fois que Mosca est correctement installé, vous pouvez créer un nouveau fichier avec le code suivant:

(
~spkrPos =
[  [0, 10.5, 2.3],// 1
	[-8,7.5,2.3], // 2
	[-8,3.75,2.3], //3
	[-8,0,2.3], //4
	[-8,-3.75,2.3], //5
	[0,-10.5,2.3], //6
	[6.75,-3.75,2.3], //7
	[6.75,0,2.3], //8
	[6.75,3.75,2.3], //9
	[6.75,7.5,2.3] //10
];


// then you need to check the ADT run file that got created in the ADT example folder and execute it
// if all goes well and you also have Faust installed the Ugens should just come out like that :-)

// my apologies this is all very hacky but has been useful so far!


~spkrPos = ~spkrPos.collect({|item,i| Cartesian(item[0], item[1],
	item[2]).asSpherical.rotate(-pi/2)});

~spkrPos = ~spkrPos.collect({|item,i| [item.theta.raddeg,
	item.phi.raddeg, item.rho]});

)

Le tableau du début du fichier correspond aux coordonnées cartésiennes des enceintes par rapport à une origine théoriquement au milieu (légèrement décallée dans notre cas). Utiliser le raccourci CTRL+ENTER pour executer ce script. Sur la console de sortie à droite, s’affiche alors une liste qui correspond au positionnement des enceintes dans un repère polaire.

Créer un nouveau fichier avec le code suivant:

(
"SC_JACK_DEFAULT_INPUTS".setenv("ossia score");
Server.killAll; // Make sure no servers are running yet
Server.supernova;
~supercoll = OSSIA_Device("SC"); // Create and name an OSSIA_Device to contain all of Mosca's parameters
//~supercoll.exposeOSCQueryServer(); // Enable OSC communication with the OSSIA_Device
~supercoll.exposeOSC();
o = s.options;
o.numInputBusChannels = 32; // Allow for many possible inputs
o.numOutputBusChannels = 10; // Stereo output for binaural rendering
o.memSize = 16384;
s.waitForBoot { // Booting server before setting up Mosca

	// ATK Binaural
    // ~decoder = FoaDecoderKernel.newCIPIC(21, s, s.sampleRate.asInteger); ~order = 1; ~setup = nil;
	~decoder = "internal";  ~order = 1;
	~setup = [ [ 0.0, 0, 10.748953437428 ], [ 46.847610265995, 0, 11.204463396343 ], 
		[ 64.885165113855, 0, 9.1297590329647 ], [ 90.0, 0, 8.3240615086627 ], 
		[ -244.88516511386, 0, 9.1297590329647 ], [ -180.0, 0, 10.748953437428 ], 
		[ -119.05460409908, 0, 8.0569845475835 ], [ -90.0, 0, 7.1310938852325 ], 
		[ -60.945395900923, 0, 8.0569845475835 ], [ -41.987212495817, 0, 10.349033771324 ] ];

	MIDIIn.connect(); // must connect to MIDI for MMC synchronisation

    ~moscaInstance = Mosca(
		maxorder: ~order,
		speaker_array: ~setup,
		outbus: 0,
        //projDir: "/path/to/project/folder",
        //rirBank: "/home/scrime/Documents/proj/rirBank",
        nsources: 10, // Set the number of sources
        decoder: ~decoder,
		dur: 20,
        parentOssiaNode: ~supercoll
	).gui();

	o.numOutputBusChannels.do({ | i |
		Pipe("jack_disconnect ossia' 'score:out_" ++ (i + 1)
			+ "system:playback_" ++ (i + 1), "w")
	})
};
)

~moscaInstance.gui();

~moscaInstance.setLevel(1, -12);

~moscaInstance.removeSource();

~moscaInstance.headTracker(8888, type:\pozyxOSC, extraArgs: [9400, 6330, 2750]);
~moscaInstance.headTracker("/dev/ttyUSB0", type:\gps);
~moscaInstance.freeHeadTracker();

~moscaInstance.parentOssiaNode.exposeOSC();

(
SynthDef("test-out", { | outbus = 0, freq = 440, radius = 0.5 |
    var source, source2, point, freqAdjust, delEnv,
    dis = Lag.kr(radius, 0.1);
    freqAdjust = dis;
    delEnv = Env.dadsr(0.2, attackTime: 0.1, decayTime: inf,
    sustainLevel: 0.9); // envelope with an onset delay equal to lag buffer
    source = Pulse.ar(freq + freqAdjust, width: dis, mul: EnvGen.kr(delEnv,
                doneAction: 2));
	// Out.ar(outbus, source); // for mono version
    source2 = Pulse.ar(freq + 3 + freqAdjust, width: dis, mul: EnvGen.kr(delEnv,
            doneAction: 2));
    Out.ar(outbus, [source, source2]);
}).send(s);

~moscaInstance.embedSynth(1, 2,
	triggerFunc:{~mySynth = Synth.new("test-out", [\freq, 220, \outbus,
		~moscaInstance.getSCBus(1, 2)]).onFree({"done".postln;})},
	stopFunc:{~mySynth.free;},
	register:~mySynth);
)

~moscaInstance.clearEmbededSynth(1);

~moscaInstance.getSCBus(1, 2);

~mySynth.free;

Utiliser le tableau généré par le programme précédent pour fixer la valeur de ~setup. La valeur de
o.numInputBusChannels permet de controler le nombre de sorties qui seront dispo dans jackd. Tapper CTRL-ENTER et vous devriez voir apparaître l’interface graphique de MOSCA:

Utiliser le tableau généré par le programme précédent pour fixer la valeur de ~setup. La valeur de
o.numInputBusChannels permet de controler le nombre de sorties qui seront dispo dans jackd. Tapper CTRL-ENTER et vous devriez voir apparaître l’interface graphique de MOSCA:

Utilisation


Cliquez droit dans le fond gris pour ajouter une source:



Pour la nouvelle source, choisisser EX-In et indiquer le Bus Index à 0 (il correspond à la sortie playback_1 qui a été ajoutée à jackd dans supernova). En utilisant qjackctl, rediriger une source son vers cette sortie (soit alsa_in/capture_1 pour les connecteurs jack micro du PC, soit PulseAudio JACK Sink/front- pour un son passant par pulse audio).

Score

Installation

Télécharger le programme Score, le plus simple étant d’utiliser la version AppImage.

Utilisation

Vous trouverez Score dans le répertoire download, pour le lancer:

cd Downloads
./ossia.score-3.0.0-a24-linux-amd64.AppImage