2023-06-07

Semaine 1

Cliquez ici pour accéder au premier billet.

2023-06-15

Semaine 2

L’un des objectifs qui m’ont été confiés cette semaine était de réinstaller SATIE à partir d’un dépôt cloné localement avec git sur la machine locale [Quarks.install("/path/to/checked/out/SATIE");], plutôt que de le télécharger directement depuis la source distante dans le compilateur SuperCollider [ Quarks.install("SATIE")]. Cette approche a l’avantage de rendre la copie de SATIE ainsi obtenue mieux adaptée au développement.

J’ai ensuite utilisé cette nouvelle copie de SATIE pour générer une configuration SATIE, et j’ai rencontré l’erreur illustrée dans l’image suivante :

Fenêtre de sortie de SuperCollider : cinq erreurs en rouge « Class extension for nonexistent class 'HOAAzimuthRotator1' » jusqu’à 5, toutes provenant du quark SC-HOA pendant la compilation de la bibliothèque de classes

Le problème a été réglé en retéléchargeant sc3-plugins.

Problèmes en suspens :

1. La tentative d’exécuter les exemples fournis dans le chapitre Ambisonics de la documentation de SATIE avec la copie retéléchargée de SATIE a échoué.

2. La perception de la spatialisation avec SATIE ne me paraît pas nette. En exécutant

(
Routine {
~addr.sendMsg('/satie/source/set', 'mySource', 'aziDeg', 30);
3.wait;
~addr.sendMsg('/satie/source/set', 'mySource', 'aziDeg', 60);
3.wait;
~addr.sendMsg('/satie/source/set', 'mySource', 'aziDeg', 90);
}.play;
)

je n’arrive pas à percevoir clairement le déplacement de la source sonore. Cela dit, la perception des effets de spatialisation reste de nature subjective.

2023-06-21

Semaine 3

Les défis rencontrés et le travail accompli cette semaine

  1. Pendant le démarrage du serveur dans SuperCollider, il est essentiel de s’assurer que les fréquences d’échantillonnage des périphériques d’entrée et de sortie concordent. En général, les périphériques d’entrée et de sortie intégrés d’un ordinateur sont normalisés à une fréquence d’échantillonnage de 44100 Hz. Par conséquent, si l’on utilise directement le microphone et le haut-parleur internes de l’ordinateur, les erreurs de non-concordance des fréquences d’échantillonnage sont généralement peu probables.

    Pour une meilleure expérience d’audio spatial, il est fortement recommandé d’utiliser des écouteurs, car ils procurent une sensation d’espace et d’immersion accrue. De plus, le degré d’immersion dépend directement du nombre de haut-parleurs employés. Plus les haut-parleurs sont nombreux, plus le système SATIE devient fonctionnel et riche, puisqu’il peut offrir une expérience auditive plus immersive. Imaginez un paysage sonore où les sons vous parviennent de toutes les directions.

    Une personne assise dans une petite pièce traitée acoustiquement, entourée de moniteurs de studio à hauteur d’oreille, plus une couche de haut-parleurs surélevés
    Figure : système ambisonique du Sound and Music Computing Lab, campus de Côme du Politecnico di Milano

    Les écouteurs que j’ai utilisés sont des Airpods Pro, qui ne sont pas recommandés pour travailler avec SuperCollider : leur microphone intégré ne fournit qu’une entrée mono à une fréquence d’échantillonnage de 16000 Hz par défaut, qu’il est impossible de modifier. La fréquence d’échantillonnage de sortie des Airpods Pro peut être réglée à 16000 Hz ou à 48000 Hz, et ils prennent en charge une sortie sur deux canaux. Cela mène fréquemment à des non-concordances de fréquences d’échantillonnage et de nombre de canaux entre l’entrée et la sortie, d’où des erreurs.

    Pour contourner ce problème, j’utilise l’outil de périphérique agrégé des réglages Audio MIDI de mon ordinateur. En créant un nouveau périphérique agrégé, il devient possible de combiner librement des périphériques d’entrée et de sortie existants, et donc de choisir des périphériques dont les fréquences d’échantillonnage et le nombre de canaux concordent. Cette approche règle efficacement le problème de non-concordance des fréquences d’échantillonnage.

    NOTE : sous OSX, avant de démarrer le serveur, il faut saisir et exécuter le code Server.default.options.device = "The_Name_of_Your_Aggregation_Device"; pour sélectionner le périphérique agrégé.


  2. L’environnement SATIE a été configuré avec succès la semaine dernière. Cette semaine, nous nous concentrons sur l’exécution du modèle SATIE de base. Il faut d’abord établir une configuration SATIE en utilisant le Spatializer, ce qui implique d’instancier une SatieConfiguration :

    ~satieConfiguration = SatieConfiguration.new(s, listeningFormat:[\octoVBAP]); 

    Le choix du paramètre listeningFormat correspond au Spatializer employé. Chaque Spatializer représente une disposition structurelle distincte de spatialisation audio, qui détermine la configuration des sorties de simulation, comme le nombre et le positionnement des sources sonores. Ensuite, on utilise cette configuration pour créer un objet Satie, c’est-à-dire instancier le moteur de rendu SATIE et le démarrer :

    ~satie = Satie.new(~satieConfiguration);
    ~satie.boot(); 

    Enfin, on crée une source audio et on règle différents angles d’azimut pour manipuler le champ sonore, afin d’obtenir l’effet de spatialisation audio souhaité :

    ~synth = ~satie.makeSourceInstance(\dusty, \dustyRez, \default, synthArgs: [\density, 7, \attack, 15, \gainDB: -10]);
    
    
    ~synth.set(\aziDeg, 0) 
    ~synth.set(\aziDeg, -90) 

Interface graphique pour les scénarios SATIE

L’outil SatieGUI est un bon moyen de comprendre les capacités de spatialisation audio prises en charge par SATIE. (Merci à Edu @edumeneses de l’avoir fourni.) Je vais en montrer l’utilisation. Voici le code :


~visualizer = SatieGUI.new(~satie);

~visualizer.drawViews;

Après avoir démarré le serveur SATIE, vous pouvez ouvrir l’interface graphique avec le code ci-dessus. Elle est illustrée dans la figure ci-dessous :

Vue de dessus

Vue de face

En choisissant différents Spatializers, vous pouvez observer des dispositions et des quantités variables de sources ponctuelles dans l’interface graphique. Dans cet exemple, octoVBAP est utilisé. Il vaut la peine de mentionner qu’il est aussi possible d’employer plusieurs Spatializers simultanément, mais il faut alors déclarer au préalable les canaux de sortie de chacun avec outBusIndex au moment de définir la configuration SATIE. Sur la figure, chaque source ponctuelle numérotée représente une source sonore de la spatialisation audio générée par le Spatializer. En réglant différentes directions d’azimut, vous activez la source sonore correspondant à cette direction. Par exemple, la source ponctuelle 0 est placée devant l’utilisateur, la source ponctuelle 2 est à sa gauche (variable aziDeg réglée à 90), la source ponctuelle 6 est à sa droite (variable aziDeg réglée à -90) et la source ponctuelle 4 est derrière lui (variable aziDeg réglée à 180 ou -180). Pour assurer une perception juste de la spatialisation audio, en particulier lorsque le périphérique de sortie de l’utilisateur a ses limites, l’outil Server Meter de SuperCollider peut servir d’aide précieuse pour surveiller les données avec précision :

Meter Server

Comme le montre la figure, les 7 canaux de sortie correspondent un à un aux sources ponctuelles numérotées de l’interface graphique présentée plus haut. Lorsque l’angle d’azimut est réglé à 0 degré (~synth.set(\aziDeg, 0)), on voit clairement dans le Meter que seul le canal 0 présente une fluctuation de signal. Cela confirme que seule la source sonore située directement devant l’utilisateur est activée.

Mapper

Le Mapper, un plugiciel de SATIE, est au cœur de mes recherches et de mon travail de développement dans ce projet. D’abord, un grand merci à Michal @djiamnot pour la création du diagramme et la modélisation avec Blender, ainsi qu’à Edu @edumeneses pour ses explications détaillées. Leurs contributions ont grandement amélioré ma compréhension du Mapper.

2023-07-02

Semaine 4

Mapper

Le Mapper, un plugiciel de SATIE, est au cœur de mes recherches et de mon travail de développement dans ce projet. D’abord, un grand merci à Michal @djiamnot pour la création du diagramme et la modélisation avec Blender, ainsi qu’à Edu @edumeneses pour ses explications détaillées. Leurs contributions ont grandement amélioré ma compréhension du mapper.

📝 La fonction première du mapper est d’améliorer la souplesse avec laquelle on sélectionne et change de spatializer en temps réel. L’ajout de paramètres supplémentaires a permis d’affiner la configuration de la scène sonore et d’améliorer encore l’agencement spatial, en tenant compte en particulier des relations sémantiques entre les différents spatializers. Les divers spatializers s’adaptent ainsi mieux et plus commodément à différents scénarios d’utilisation de SATIE.

Spatializer

Chaque spatializer représente une disposition structurelle distincte de spatialisation audio, qui détermine la configuration des sorties de simulation, comme le nombre et le positionnement des sources sonores. Le répertoire ./satie/plugins/spatializers du dépôt de SATIE permet de consulter les différents types de spatializers actuellement offerts.

Les spatializers que j’ai utilisés jusqu’ici sont \stereoPanner, \headphoneListener et \octoVBAP. Les deux premiers fournissent respectivement des sources sonores à gauche (-90) et à droite (90). Quant à \octoVBAP (il en va de même pour \domeVBAP, \exaVBAP, etc.), il s’agit de l’application concrète, dans SuperCollider, du principe du VAPA (Vector Base Amplitude Panning), qui permet de créer plusieurs sources audio virtuelles de type ambiophonique afin d’enrichir la spatialisation audio et d’en accroître l’efficacité.

Le mapper \nearFarField1

Ce mapper simule un champ proche et un champ lointain virtuels en mettant à l’échelle le gain de différents spatializers, ce qui crée des perceptions distinctes de la distance entre l’utilisateur et les sources sonores associées à chaque spatializer.

L’analyse du code source du mapper (nearFarField1.scd) montre que son paramètre clé est nfIndex, l’indice du champ proche, utilisé ici comme facteur d’échelle du gain.

nfGain = gainDB.dbamp * nfIndex;
ffGain = gainDB.dbamp * (1 - nfIndex);

D’après le code ci-dessus, nfIndex + ffIndex = 1. Si l’on suppose nfIndex = 0.3, le rapport de gain entre le champ proche et le champ lointain est de 3 : 7 (pas en échelle dB). Lorsque le mapper nearFarField1 est utilisé avec deux spatializers stereoPanner, l’effet obtenu est le suivant :

Vumètres avec nfIndex à 0.3 : les canaux de sortie 0 et 2 restent silencieux, tandis que le canal 3 affiche un niveau nettement plus élevé que le canal 1

Vumètres avec nfIndex à 0.5 : les canaux de sortie 0 et 2 restent silencieux, tandis que les canaux 1 et 3 affichent le même niveau

Vumètres avec nfIndex à 0.8 : les canaux de sortie 0 et 2 restent silencieux, tandis que le canal 1 affiche un niveau bien supérieur à celui du canal 3

Dans la démonstration ci-dessus, les canaux de sortie 0 et 1 correspondent à la sortie d’un stereoPanner, tandis que les canaux 2 et 3 correspondent à l’autre stereoPanner. En ajustant le paramètre nfIndex, on peut observer des effets de champ proche et de champ lointain distincts.

NOTE : dans cette démonstration, les paramètres sont identiques à l’exception de nfIndex, alors que aziDeg est réglé à 90 partout (à droite).

Essai de différents sons avec le mapper \nearFarField1

Nom du son\aziDeg\nfIndex
dustyRez
Tubie
Gravity
Marimba
SpaceDolph

2023-07-16

Semaines 5 et 6

Le mapper cartesianControl

L’objectif de ce mapper est d’ajuster indépendamment la position du spatializer dans le système de coordonnées cartésiennes en précisant chacun des points de coordonnées x, y et z.

Deux pistes se dessinent pour créer ce mapper :

  1. La position du spatializer était auparavant contrôlée à l’aide du paramètre d’angle d’azimut. Ma première idée a donc été d’établir un lien entre les coordonnées sphériques et les coordonnées cartésiennes, c’est-à-dire de contrôler les paramètres aziDeg et eleDeg en introduisant de nouveaux paramètres, à savoir coordinateX, coordinateY et coordinateZ, pour manipuler la position du spatializer.

Schéma d’un système de coordonnées cartésiennes en 3D : les axes x, y et z, avec un point P(x, y, z) situé par des projections pointillées

En ambisonie, le principe de la main droite s’applique lorsqu’on utilise le système de coordonnées cartésiennes. L’axe des x correspond à l’orientation avant-arrière, tandis que l’axe des y correspond à l’orientation gauche-droite (les valeurs positives indiquant le côté gauche).

Ces deux systèmes de coordonnées peuvent être convertis l’un dans l’autre. Dans SuperCollider, le système de coordonnées correspondant peut être établi à l’aide des méthodes de classe Spherical et Cartesian. Leurs fonctions mathématiques permettent d’effectuer la conversion entre les deux systèmes.

Par exemple :

~rho = 1; // meters
~azi = 90; // degrees
~ele = 0; // degrees

~spherical = Spherical.new((~diameter),((~azi*pi)/180),((~ele*pi)/180)); // Create a new spherical coordinate with the above parameters

~spherical.x; // Answer the cartesian coordinate x of the receiver
~spherical.y; // Answer the cartesian coordinate y of the receiver
~spherical.z; // Answer the cartesian coordinate z of the receiver

La conversion ci-dessus donne le point (0, 1, 0) dans le système de coordonnées cartésiennes. La valeur sur l’axe des y est donc positive, ce qui indique que le spatializer est situé à gauche.

  1. Simuler différents points du système de coordonnées cartésiennes en ajustant l’amplitude du gain.

2023-07-28

Semaine 7

Le schéma illustrant la construction de SATIE

Schéma de flux : un bloc DSP alimenté par les générateurs et les effets, un bloc MAPPER alimenté par de nouveaux arguments et un bloc OUT piloté par le spatializer, le tout encapsulé dans un seul SynthDef

Schéma de fonctionnement de SATIE

Le schéma montre clairement que le mapper intervient avant le spatializer et qu’il introduit de nouveaux arguments réglables. Selon les objectifs visés, chaque mapper contrôle les paramètres de sortie par défaut à partir des algorithmes et des formules correspondants, en s’appuyant sur ces nouveaux arguments. Cela accroît la souplesse et l’extensibilité de l’ensemble du processus et enrichit encore les fonctionnalités de SATIE.

Le mapper cartesianControl

Ce mapper vous permet de définir la position du spatializer en précisant des points 3D (x, y, z) dans le système de coordonnées cartésiennes.

Pour l’atténuation de gainDB en fonction de la distance, nous utilisons deux modèles, le modèle de distance inverse et le modèle de distance exponentiel, afin de simuler et de déterminer la réduction du volume à mesure qu’un spatializer s’éloigne de l’auditeur.

Le modèle de distance « exponential » : max(d, d_ref) sur d_ref, élevé à la puissance moins f, avec d borné à d_ref ou plus

Problèmes en suspens

Lorsqu’on définit la position du spatializer à l’aide d’un seul mapper, les points 3D du système de coordonnées cartésiennes ainsi que l’azimut et l’élévation du système de coordonnées sphériques peuvent être définis et appliqués avec succès en même temps.

Quelques nouvelles idées pour le Mapper

  1. Contrôle du spatializer en temps réel : la position du spatializer est contrôlée en temps réel par la position de la souris, ce qui accroît l’interactivité et le plaisir d’utiliser SATIE.

  2. Intégration de TouchOSC : en reliant SuperCollider à TouchOSC par OSC, les utilisateurs peuvent contrôler les paramètres du mapper depuis leur téléphone. Par exemple, les données de mouvement de l’accéléromètre et du gyroscope du téléphone peuvent être associées au mapper pour une expérience plus polyvalente.