Sound Trajectory 4 · Annexe technique ← Retour au manuel ⬇ PDF English version

Sound Trajectory 4 — Manuel de référence

Spatialisateur sonore 3D et séquenceur de trajectoires — pour les chercheuses, chercheurs et créateurs. Ce manuel explique à la fois les gestes (comment faire) et les mathématiques exactes du moteur (quelles formules, avec quelles conventions), telles qu'implémentées dans le code.

1. Vue d'ensemble

Sound Trajectory 4 (ST4) est un spatialisateur 3D couplé à un séquenceur : on y place des sources sonores (des pistes audio, mono ou multicanales) dans un espace tridimensionnel normalisé, on leur dessine des trajectoires, et le moteur calcule en temps réel les gains à envoyer à chaque haut-parleur d'un dispositif quelconque (couronne, dôme, salle multicanale) — ou un repli binaural au casque.

Vue générale de Sound Trajectory 4
La fenêtre principale : chutier de pistes (gauche), scène 3D (centre), séquenceur (bas), panneau de configuration (droite).

Deux éditions, un seul modèle

Dans l'édition desktop, tout ce que vous manipulez dans l'interface est transmis au moteur natif ; ce que vous entendez vient toujours du natif. Les formules du § 5 sont vérifiées identiques (vecteurs dorés, écart 0) entre les deux moteurs.

Ce que ST4 sait faire

2. L'interface, panneau par panneau

2.1 Le chutier de pistes

Le chutier de pistes
Le chutier : deux lignes par piste, VU dans la rainure du volume.

La colonne de gauche liste les pistes sous forme compacte, deux lignes par piste :

Le menu déroulant en tête filtre le chutier par groupe de mix. Chaque carte de piste est aussi une cible de dépôt : glissez un fichier audio dessus pour le charger (le glissement de réordonnancement et le dépôt de fichier sont distingués automatiquement). Le bouton + Nouvelle Piste crée une piste ; l'import multi-fichiers crée une piste par fichier.

2.2 Le Setup de piste

Le Setup de piste
Le Setup : type d'entrée, nombre de canaux, mode de source, AmbiX, index ADM-OSC in/out, matrice d'entrée.

Le Setup regroupe tout ce qui définit d'où vient le signal de la piste et comment il est adressé :

Gain, spread et orientation ne sont pas dans le Setup : ils vivent là où on les joue (le gain au chutier, le spread et l'orientation dans le panneau de droite).

2.3 Le gestionnaire de pistes et la matrice globale

Le gestionnaire de pistes
Gestionnaire 1/3 – 2/3 : la liste éditable à gauche, la matrice globale (entrées carte son → pistes) à droite. Les cases rouges signalent un conflit.

Le gestionnaire présente, sur 1/3 de la largeur, la liste éditable des pistes (couleur, nom, nombre de canaux, source, groupe, suppression, ajout en lot) et, sur 2/3, la matrice globale : chaque ligne est une piste, chaque colonne une entrée physique de la carte son. Une piste occupe un bloc contigu de canaux (façon ST3) : cliquer une case y place le début du bloc de la piste. Deux blocs qui se chevauchent s'affichent en rouge : c'est un conflit d'entrée à résoudre.

2.4 La table de mix

La table de mix
Tranches de pistes (fader, M/S, groupe, envois R1–R4), tranches de groupes, et le rack des 4 reverbes (EN, retour, Fixe/Suit, preset, decay).

La table de mix rassemble le mixage « console » :

Le rendu des slots de reverbe est natif (édition desktop) ; le navigateur porte les réglages sans le son.

2.5 La scène 3D

La scène 3D
La scène : haut-parleurs (gris), trajectoires (cyan), sources, et le listener au centre.

La scène montre le dispositif de haut-parleurs, les sources et leurs trajectoires dans l'espace normalisé (coordonnées −1…+1 sur chaque axe ; +X à droite, +Y devant, +Z en haut). On y dessine et édite les trajectoires (points de contrôle draggables ; Alt pour la hauteur), on déplace les enceintes et le listener. Les modes de vue : Libre (orbite), Dessus, Splittée. Les trajectoires peuvent être linéaires ou lissées (spline Catmull-Rom, § 5.5), ouvertes ou fermées.

2.6 Le séquenceur / la timeline

La timeline
La timeline : une rangée par piste, clips audio, boucle et marqueurs.

Chaque piste a une rangée : on y dépose des fichiers (ou Parcourir), on découpe (Split), on déplace les clips. L'onglet Automations superpose les courbes d'automation (position sur trajectoire, volume, paramètres continus) ; Auto↔Clip convertit dans les deux sens. La rangée Boucle définit un bouclage par cliquer-glisser ; les Marqueurs se posent sur la règle. La vitesse de lecture (5–400 %) s'applique en varispeed (resample) ou en préservation de hauteur (Pitch/wsola, moteur Signalsmith Stretch).

2.7 Le sampler

Le sampler
Le mode Sampler : 16 pads one-shot, hors timeline.

Le bouton Sampler bascule la timeline en grille de 16 pads. Chaque pad est une piste spéciale (hors timeline) qui joue son sample en one-shot au déclenchement — clic, note MIDI (keymap : note racine, bornes basse/haute, canal), ou OSC (/sampler/trigger, /sampler/note). Un pad peut contenir plusieurs samples (lecture dans l'ordre ou aléatoire), être monophonique, et suivre une courbe de volume. Le bouton Panic (assignable MIDI/OSC) coupe toutes les voix en cours.

2.8 Le panneau haut-parleurs et la calibration

Panneau enceintes
Configuration des enceintes : preset, nombre, table des positions, VU par HP.
Acoustique : modèle de spatialisation et roll-off
Onglet Acoustique : choix du modèle (MBAP/VBAP/WFS) et courbe de roll-off (atténuation par distance, éditable — la courbe pointillée est le wet).

L'onglet Enceintes configure le rig : preset (couronnes, dômes…), nombre d'enceintes, table des positions (x, y, z normalisés), glisser-déposer dans la vue 3D, import/export. Chaque enceinte possède une calibration : un gain (linéaire), un délai (ms) et un EQ par bandes, appliqués par le moteur avant la sortie (mode Direct) ou avant le repli binaural. Une routine de calibration acoustique au micro peut mesurer et proposer ces valeurs ; la courbe d'EQ par HP s'édite aussi à la main. L'onglet Acoustique choisit le modèle de panning et façonne le roll-off de distance (§ 5.6) — la version dry (le son direct baisse avec la distance) et la version wet (l'envoi de reverbe monte avec la distance), indépendantes. Le mode de sortie (en-tête, à droite) bascule entre sortie multicanale directe et Binaural (casque).

3. Concepts & fonctions détaillées

3.1 Trajectoires

Une trajectoire est une liste ordonnée de points de contrôle dans l'espace normalisé. La position de la source à l'instant du transport est P(t), où t ∈ [0,1] est la progression le long du chemin (elle-même animée par la timeline, une automation, un LFO, ou un contrôleur externe). Entre les points, l'interpolation est linéaire par morceaux par défaut, ou spline Catmull-Rom (tension 0,5) quand le mode spline est actif et qu'il y a au moins 3 points — la formule exacte est au § 5.5. Une trajectoire fermée ajoute un segment de bouclage dernier→premier point. La spline n'est pas bornée : elle peut déborder légèrement entre les points, c'est voulu (et identique web/natif).

3.2 Modes de source (pistes multicanales)

Le mode de source décide comment les canaux d'une piste multicanale sont posés dans l'espace et orientés :

ModePlacementOrientation
Normal La géométrie relative des canaux, autour du centre de la piste, tournée autour de Z (rotation utilisateur + spin). Celle que l'utilisateur fixe (orientation de source globale, ou par canal).
Barycentre (défaut) Même géométrie autour du centre… …mais le réseau pivote vers le listener et chaque source le regarde.
Le long de la trajectoire Les canaux sont répartis uniformément le long du chemin, à écart constant 1/N, et glissent ensemble avec la progression. Chaque canal regarde dans le sens de la marche (la tangente avant), comme un marcheur sur son chemin.
Le long + barycentre Mêmes positions le long du chemin… …mais les sources regardent le listener.

Dans les modes « le long de la trajectoire », la position du canal c (sur N) est u = frac(progression + c/N) : la répartition tourne — ce qui sort par la fin de la trajectoire rentre par le début (modulo 1), y compris sur un chemin ouvert (le retour fin→début y est alors un saut, assumé). Sans cet enroulement, les canaux de queue s'entasseraient sur le dernier point ; ici ils défilent en ronde.

3.3 Groupes de mix

Chaque piste peut appartenir à un groupe (champ libre dans la table de mix — le groupe est créé au premier contact, y compris par OSC). La composition est celle d'une console :

3.4 Envois et les 4 slots de reverbe

Quatre bus d'envoi mono sont accumulés au rendu (envoi piste + envoi groupe), puis chacun est convolué par la réponse impulsionnelle de son slot (presets d'IR synthétisées par decay, ou IR personnalisée importée). Le retour du slot est dosé par son niveau de mix. Le choix décisif est où le retour rejoint le signal :

S'y ajoute la reverbe globale héritée (post-repli, panneau Effets) et le roll-off wet (§ 5.6) : plus une source est loin, plus son envoi de reverbe peut monter, indépendamment de l'atténuation du son direct.

3.5 Modes de panning : MBAP, VBAP, WFS

Les libellés de l'interface, et les termes qu'ils recouvrent. Depuis le 7 août 2026 l'interface nomme les lois par des objets — une enveloppe, une visée, une nappe : on peut les dessiner. Les termes académiques ne sont pas remplacés, ils sont mis en regard : la paternité est due, et le chemin de l'un à l'autre doit faire un clic. Ce qui est stocké ne change pas (mbap, vbap, wfs) : une session ancienne s'ouvre à l'identique.

Libellé d'interfaceTerme techniqueCe que la loi fait
Enveloppe (Envelope)MBAP Toutes les enceintes portent la source, selon leur distance. La seule loi qui tienne quand la source traverse le dispositif ou passe à l'intérieur.
Visée (Aim)VBAP La source est tenue par les enceintes qu'elle regarde. Image très nette au point d'écoute, qui se déplace avec l'auditeur.
Nappe (Sheet)WFS Les enceintes qui font face à la source la portent ensemble, chacune à son instant : le front d'onde est reconstitué.
Maillage (Mesh)Voronoï sphérique Le dispositif découpe lui-même son territoire : chaque enceinte est une station et reçoit la source quand elle occupe sa zone.

Le Maillage n'est pas un panner, et il ne faut pas l'attendre comme tel. C'est une loi pour les installations scénographiées, où la présence de chaque enceinte marque un point : un seul haut-parleur sonne à la fois, et son niveau suit une distance angulaire normalisée par l'extension propre de sa cellule — une station serrée entre deux voisines a un seuil raide, une station isolée rayonne large. Le dispositif écrit la dramaturgie.

Conséquence à connaître : la loi a un zéro sur chaque frontière de cellule. Sur un anneau de huit enceintes, une source qui fait un tour traverse huit creux ; et au-dessus d'un anneau plan, le zénith est silencieux — la source y est à égale distance de toutes, donc pile sur une frontière (sur un dôme, l'enceinte de plafond en fait une vraie station). Ce n'est pas un défaut : c'est ce que la loi dit — être entre deux stations, c'est n'être à aucune.

D'où les réglages, qui sont le vocabulaire de la passation d'une station à l'autre : Courbe (franche · linéaire · exponentielle · douce — la franche est le défaut : la station s'allume et s'éteint, métaphore radio), Fondu (la dose de la courbe), Plancher (change le zéro de frontière en saut à niveau constant), Point de présence maximale (sur l'enceinte, ou au centre de son territoire) et Largeur (0 = une station, 1 = tout le dispositif). La loi vient des travaux d'EarMotion, portée en trois dimensions par un Voronoï sphérique des directions d'enceintes.

Deux réglages voisins portent aussi un nom d'usage : Diffusion du champ (l'exposant MBAP, 1 à 8 — net en régie, diffus en salle ; il ne change pas la loi, seulement sa largeur) et Lieu d'écoute (Régie · Salle · Casque · Traversée), qui règle d'un coup la loi, la diffusion, les deux courbes d'atténuation, le Doppler, la réverbe et le lissage. Un lieu est une action, pas un mode : il écrit une fois dans des champs qui existent déjà, et tout reste éditable ensuite.

3.6 Binaural (casque)

En mode de sortie Binaural, chaque bus d'enceinte calibré est convolué par la paire de HRIR (gauche/droite) correspondant à sa direction (azimut, élévation), puis sommé en stéréo. Deux fournisseurs de HRIR :

3.7 Entrée ambisonique AmbiX (ordres 1–11)

Une piste « AmbiX » transporte sur ses canaux d'entrée les composantes en harmoniques sphériques d'un champ sonore, au standard AmbiX : ordre des canaux ACN (index = n² + n + m), normalisation SN3D, harmoniques réelles sans phase de Condon–Shortley. Le décodage vers le rig est un décodeur par échantillonnage (projection) : la matrice de gains D[c][s] = Yc(dirs)/N (§ 5.2). L'ordre est déduit du nombre de canaux ((ordre+1)² : 4, 9, 16, 25, … 144). L'atténuation de distance est appliquée une fois, depuis le centre de la piste — les composantes ne sont pas des positions, elles ne sont pas pannées individuellement.

Limite navigateur : un ChannelSplitterNode Web Audio plafonne à 32 canaux — l'édition web s'arrête donc à l'ordre 4 (25 canaux). Le moteur natif n'a pas cette limite et couvre les 11 ordres (144 canaux).

3.8 ADM-OSC entrant et sortant

ST4 parle le vocabulaire ADM-OSC (spécification communautaire alignée sur le modèle ADM de l'ITU-R BS.2076) dans les deux sens :

Convention de coordonnées (identique dans les deux sens, § 5.3) : +X droite, +Y devant, +Z haut ; azimut = atan2(x, y) en degrés (0° devant, positif vers la droite) ; élévation = atan2(z, √(x²+y²)) ; distance ≤ 1.

3.9 MIDI Learn

N'importe quel CC MIDI peut être mappé sur n'importe quel paramètre continu : armez l'apprentissage (/midi/learn <chemin.de.paramètre> ou depuis l'interface), tournez un potentiomètre — le prochain CC reçu est lié. /midi/unlearn <cc> retire un mapping, /midi/maps publie la table, et les mappings persistent entre les sessions. Les notes MIDI jouent les pads du sampler (keymap par pad : racine/bornes/canal) ; un contrôleur OSC peut injecter des CC (/midi/cc) et des notes (/sampler/note) par le même chemin que le matériel. L'entrée MIDI s'ouvre par /net/midi/start (tous les périphériques, ou un seul choisi en préférences).

3.10 Le langage Script (français)

Le menu Script ouvre un éditeur pour un petit langage interprété en français, fait pour les opérations en lot. Sûr par construction : jamais d'eval() — un script ne peut qu'appeler les primitives autorisées (pas de DOM, pas de fichiers, pas de JS arbitraire), et le langage garantit la terminaison (pas de boucle tant que, pas de récursion). Mots-clés : soit, pour … dans …, si/sinon, vrai/faux/rien, et/ou/non. L'AST est le contrat : le même arbre peut venir du texte ou de l'éditeur de nœuds graphique.

# Distribue un dossier de samples : un sample par pad.
soit fichiers dans choisir_dossier()
pour f dans fichiers
    soit i dans longueur(pads())
    pad_ajouter(i, f)
    pad_nom(i, f.nom)
appliquer()

Primitives notables : choisir_dossier/choisir_fichiers, pads, pad_ajouter, pad_vider, pad_note, pad_mono, pad_aleatoire, distribuer, jouer, arreter, pause, aller_a, position, bpm, duree, pistes, piste, piste_creer, piste_supprimer, piste_nom, piste_volume, piste_mute, piste_solo, piste_charger, piste_trajectoire, piste_span, piste_echelle, auditeur, reverb, volume_general, et les passe-partout param(chemin, valeur) / osc(...) qui atteignent tout paramètre et tout verbe OSC du logiciel.

3.11 Calibration des haut-parleurs

Par enceinte : un gain linéaire, un délai en millisecondes (jusqu'à 100 ms — pour aligner temporellement des enceintes à distances inégales) et un EQ par bandes. La calibration est appliquée dans l'étage de sortie, avant la copie directe vers l'interface (mode Direct) et avant le repli binaural — le binaural entend donc la salle corrigée. Une mesure au micro (boîte « Calibration Acoustique ») peut remplir ces valeurs automatiquement ; les courbes d'EQ par HP restent éditables à la main.

4. Exemples d'utilisation pas-à-pas

4.1 Spatialiser une voix sur une trajectoire circulaire

  1. Créer la piste. Chutier → + Nouvelle Piste (mono). Nommez-la « Voix » (double-clic sur le nom).
  2. Charger le son. Glissez votre fichier sur la carte de la piste (ou Parcourir dans sa rangée de timeline).
  3. Dessiner le cercle. Dans la scène 3D, sélectionnez la piste, passez en mode trajectoire et posez 8–12 points en cercle autour du centre (ou chargez le preset de trajectoire circulaire). Activez fermée et spline : le polygone devient un cercle lisse.
  4. Animer la progression. Onglet Automations → lane « position sur trajectoire » : une rampe 0 → 100 % sur la durée de la boucle. (Alternative sans timeline : un modulateur LFO/rampe sur la destination progression.)
  5. Boucler et jouer. Définissez la boucle sur la rangée Boucle, puis Espace.
Ce qu'on doit entendre : la voix tourne régulièrement autour du public (ou de votre tête, en binaural), sans saut au raccord de boucle — le cercle est fermé. Si la course paraît anguleuse, c'est que le mode spline n'est pas actif.

4.2 Un chœur multicanal « le long de la trajectoire »

  1. Créer une piste 8 canaux. Gestionnaire de pistes → Ajouter 1 piste de type 8 canaux (ou Setup → Nb canaux = 8). Chargez un fichier de chœur 8 canaux — ou 8 voix mono sur une piste par la matrice d'entrée.
  2. Dessiner un chemin. Une longue courbe qui serpente à travers la salle (ouverte ou fermée — les deux marchent).
  3. Choisir le mode. Setup → Mode de source → « Le long de la trajectoire ».
  4. Vérifier dans la scène : les 8 chanteurs s'égrènent sur le chemin, à écart constant (1/8 du chemin entre voisins).
  5. Jouer en animant la progression (comme en 4.1, étape 4).
Ce qu'on doit entendre : une procession — le chœur défile en file indienne le long du chemin, chaque voix orientée dans le sens de la marche. Sur un chemin fermé, la ronde est parfaite : le premier chanteur ressort derrière le dernier (la répartition tourne modulo 1). Variante : le mode « le long + barycentre » fait chanter la file vers vous.

4.3 Mixer par groupes, avec une salle fixe et une reverbe suiveuse

  1. Grouper. Table de mix → dans les tranches de pistes, tapez « Cordes » pour les pistes de cordes, « Solistes » pour les solistes. Les tranches de groupes apparaissent.
  2. Configurer R1 = la salle. Rack de droite, slot Reverb 1 : EN, preset hall, decay ≈ 2,5 s, mode Fixe (dans la salle), retour ≈ 30 %.
  3. Configurer R2 = l'aura. Slot Reverb 2 : EN, decay court (≈ 1 s), mode Suit le listener.
  4. Doser les envois. Tranche du groupe « Cordes » : envoi R1 ≈ 0,4. Tranche de la piste soliste : envoi R2 ≈ 0,25. (Envoi effectif = piste + groupe, borné à 1.)
  5. Éprouver la composition. Mute du groupe « Cordes » : toutes les cordes se taisent d'un geste. Solo du groupe « Solistes » : il ne reste qu'eux. Le fader de groupe scale toutes ses pistes (gain = piste × groupe).
  6. Tourner la tête. En binaural, faites pivoter le listener (ou déplacez-le).
Ce qu'on doit entendre : la salle (R1) reste accrochée à la salle — en tournant, sa masse réverbérée tourne par rapport à votre tête, comme dans un vrai lieu. L'aura du soliste (R2) reste collée à vos oreilles, identique quel que soit le cap. C'est la différence Fixe/Suit, pré- ou post-repli binaural.

4.4 Piloter les positions depuis une console ADM-OSC

Hypothèses : la console émet de l'ADM-OSC vers la machine ST4, port 9101 ; on veut aussi renvoyer les positions de ST4 vers un renderer externe sur 9100.

  1. Ouvrir l'écoute ADM. Onglet OSC & MIDI → ADM-OSC in, port 9101 (ou envoyez le verbe : /net/adm/listen 9101). Le choix persiste au relancement.
  2. Assigner l'objet. Setup de la piste à piloter → Index ADM-OSC in = 1. Une piste de 4 canaux écoutant l'index 1 possède les objets 1 à 4. La piste ignore désormais sa trajectoire : la console est maîtresse.
  3. Envoyer depuis la console (un axe par message, floats) :
    /adm/obj/1/azim  -30.0     # degrés : 0 = devant, + = droite
    /adm/obj/1/elev   15.0     # degrés : + = haut
    /adm/obj/1/dist    0.8     # 0..1
    # ou en cartésien :
    /adm/obj/1/x 0.5    /adm/obj/1/y 0.7    /adm/obj/1/z 0.1
    Les axes polaires fusionnent : un /azim seul fait orbiter la source à distance constante, depuis sa position courante.
  4. Renvoyer vers un renderer (facultatif) : /net/adm/connect 192.168.1.50 9100 — ST4 émet alors le jeu complet /adm/obj/<n>/x|y|z|azim|elev|dist pour chaque objet, l'index de départ de chaque piste étant son Index ADM-OSC out.
  5. Commande générale (facultatif) : le port 9000 accepte tout le lexique (annexe § 8) — transport, faders, groupes… — et répond sur le port 9001. Les messages /adm/obj/… arrivant sur 9000 sont aussi acceptés (interception sans acquittement, pour tenir un flux à 100 Hz).
Ce qu'on doit entendre : la source suit le joystick/l'encodeur de la console, sans à-coups, pendant que le reste de la session (trajectoires des autres pistes, transport) continue de vivre. Ramenez Index ADM-OSC in à 0 pour rendre la piste à sa trajectoire.

5. Formules du moteur

Toutes les formules ci-dessous sont extraites du code (moteur web MbapSpatializer.js/AudioEngine.js et moteur natif Spatializer.cpp/MixRenderer.cpp, vérifiés identiques par vecteurs dorés). L'espace est normalisé : positions dans [−1, 1]³, +X à droite, +Y devant, +Z en haut.

5.1 Harmoniques sphériques réelles — AmbiX (ACN / SN3D)

Convention interne du décodeur (directions d'enceintes) : azimut φ=atan2(y,x) (sens antihoraire depuis +X, dans le plan horizontal), élévation θ=atan2(z,x2+y2). Harmoniques réelles, ordre des canaux ACN, normalisation SN3D (semi-normalisation de Schmidt), sans phase de Condon–Shortley :

Ynm (φ,θ) = Nn|m| Pn|m| (sinθ) · { cos(mφ)m≥0 sin(|m|φ)m<0 Nnm = (2−δm,0) (n−m)! (n+m)! , ACN=n(n+1)+m

où Pnm sont les polynômes de Legendre associés sans le facteur (−1)m. Ancrage au premier ordre (AmbiX — noter l'absence du facteur √3, qui appartiendrait à N3D) :

Y0=1 Y1=sinφcosθ Y2=sinθ Y3=cosφcosθ

(W, Y, Z, X — ACN 0…3). Les ordres 2 et 3 sont écrits en polynômes explicites dans le code, les ordres 4 à 11 par la récurrence de Legendre standard (stabilisée : le rapport de factorielles est accumulé en produit de réciproques — à l'ordre 11, 22! ≈ 1,1·10²¹ dépasse la précision entière des doubles). Orthonormalité SN3D vérifiée numériquement par quadrature jusqu'à l'ordre 11 : ∫ Yc Yc' dΩ / 4π = δcc' à la précision machine.

5.2 Matrice de décodage ambisonique

Décodeur par échantillonnage (projection) : le gain de la composante ACN c vers l'enceinte s, de direction (φs, θs), sur un rig de N enceintes :

D[c][s] = Yc(φs,θs)N

La pondération 1/N est choisie pour être indépendante du nombre d'enceintes : un champ « W seul » (omni, ACN0 = 1) donne exactement 1/N par enceinte — même niveau acoustique total quel que soit le rig. Le signal décodé est ensuite multiplié par l'atténuation de distance du centre de la piste (§ 5.6).

5.3 Conversions azimut/élévation/distance ↔ xyz (ADM-OSC)

Convention ADM-OSC et interface (0° = devant = +Y, azimut positif vers la droite, élévation positive vers le haut) :

azim=atan2(x,y) elev=atan2(z,x2+y2) dist=min(1,‖p‖) x=dcos(elev)sin(azim) y=dcos(elev)cos(azim) z=dsin(elev)
Attention à ne pas confondre les deux azimuts : l'azimut ADM-OSC est mesuré depuis +Y (devant), atan2(x, y) ; l'azimut interne du décodeur ambisonique (§ 5.1) est mesuré depuis +X, atan2(y, x). Les deux conventions coexistent dans le logiciel, chacune constante dans son domaine.

5.4 Directivité de source (facteur polaire du premier ordre)

Le réglage directivité (0 = omni … 1 = hypercardioïde) engendre un facteur polaire par enceinte, avec a = directivité × 0,75 et θ l'angle entre le vecteur « avant » de la source et la direction source→enceinte :

g(θ)= clamp( (1−a)+a·cosθ ,0,1) , a=0.75·directivité

Le vecteur avant vient de l'orientation de source (azimut/élévation, mesurés depuis +Y : fwd = (sin az·cos el, cos az·cos el, sin el)), ou il est imposé par le mode de source (vers le listener en barycentre, tangente du chemin en « le long de la trajectoire ») ; il peut aussi être fixé par canal. À directivité 0, le facteur vaut exactement 1 (aucun effet).

5.5 Trajectoire : spline Catmull-Rom

Sur le segment entre P₁ et P₂ (voisins P₀ et P₃ ; bords : indices bloqués sur chemin ouvert, enroulés modulo n sur chemin fermé), avec t ∈ [0,1] local au segment — le Catmull-Rom uniforme, tension 0,5 (Catmull & Rom 1974) :

P(t)= 12 [ 2P1 +(−P0+P2)t +(2P0−5P1+4P2−P3)t2 +(−P0+3P1−3P2+P3)t3 ]

Appliquée composante par composante (x, y, z). En dessous de 3 points, ou spline désactivée : interpolation linéaire. La sortie n'est pas bornée (léger débordement possible entre points). Placement multicanal « le long de la trajectoire » : le canal c sur N est évalué à u = frac(progression + c/N) — la répartition tourne, fin → début.

5.6 Atténuation par distance (roll-off)

d = distance listener→source (espace normalisé), ref = distance de référence (gain 1 en deçà ; défaut 1), max = distance maximale (défaut 8), f = facteur de pente (défaut 1). Quatre modèles (dry) :

inverse (défaut) :  g(d)= refref+f·(d−ref) inverse carré :  g(d)= (refd)2f linéaire :  g(d)= max(0,1−fd−refmax−ref)

avec g(d) = 1 pour d ≤ ref, et « custom » = interpolation linéaire par morceaux des points de contrôle dessinés par l'utilisateur. Avec ref = 1, f = 1, le modèle inverse est exactement 1/d. Le roll-off wet (envoi de reverbe) est la courbe complémentaire, indépendamment paramétrée : 0 (sec) à d ≤ ref, 1 (tout mouillé) à d ≥ max, et 1 − dry(d) entre les deux. Une source hors de l'enveloppe des enceintes (r > 1) est projetée sur l'enveloppe pour la direction, l'atténuation gardant la vraie distance — une source peut ainsi quitter le champ et s'éloigner à l'oreille.

5.7 MBAP — le champ de gains

Hérité de SpatGRIS (CUBE). Source et enceintes sont projetées sur une grille 65³ (l'espace [−1,1] → [0,64], centre 32). Le gain de base entre la source (coordonnées grille s) et l'enceinte k (coordonnées grille qk) suit une loi exponentielle en distance de grille, avec ρ = 101/20 ≈ 1,122 (1 dB par unité de grille) :

g0(k)= ρ−12‖s−qk‖

Sans span, avec E l'exposant de diffusion (1–8, défaut 2) et dk la vraie distance source→enceinte en espace normalisé :

Gk= 4g0E + g02Edk

Les spans d'azimut/élévation (0–1, alimentés par les réglages en degrés et le spread : spanaz = min(1, (span°az + spread·180°)/180°), idem élévation sur 90°) mélangent ce terme avec des variantes « plein span » pondérées par pow(span, 4+4·span·d). Normalisation finale à somme unitaire, avec compensation d'énergie vers le centre (r = ‖source‖) :

gk= Gk∑jGj ·c , c= { 21−rr<1 1sinon

5.8 VBAP (paire 2D) et WFS (simplifié)

VBAP — pour la direction u = (cos φ, sin φ) de la source dans le plan horizontal et la paire d'enceintes encadrante de directions l₁, l₂ (Pulkki 1997) :

u=g1l1+g2l2 ⇒ g1,g2 =solution 2×2, tronquée ≥ 0, puis g12+g22=1

Avec spread > 0 (MDAP) : M directions virtuelles réparties sur ±spread·π autour de φ, leurs gains de paire sommés, puis normalisation globale Σg² = 1.

WFS — pour chaque enceinte i, à distance di de la source virtuelle (distances vraies, non projetées), avec θi l'angle entre le rayon source→enceinte et la normale rentrante de l'enceinte :

gi∝ max(0,cosθi) max(10−3,di) τi= (di−dmin)·R/2c

gains normalisés à puissance constante (Σg² = 1) ; délais en secondes via l'échelle de salle R (« roomSize », défaut 30 m — le rayon du rig ≈ R/2) et c = 343 m/s ; l'enceinte la plus proche a un délai nul. Loi 1/√r = décroissance de la fonction de pilotage WFS 2.5D (Berkhout et al. 1993) ; le terme cos θ est la sélection de sources secondaires. Simplifications assumées : pas de pré-filtre √(jk) (phase stationnaire), pas de gestion du repliement spatial.

5.9 Composition des gains de mix

geff= vpiste·vgroupe mute=mutepiste∨mutegroupe audible si : ¬anySolo∨solopiste∨sologroupe sendb= clamp(sendbpiste+sendbgroupe,0,1)

Le volume de piste est remplacé par la lane d'automation de volume quand elle existe. Retour des slots de reverbe : slot FIXE → chaque canal d'enceinte reçoit wet × mix/√Nspk (pré-repli, diffus) ; slot SUIT → chaque canal du périphérique reçoit wet × mix (post-repli). Chaîne de sortie : calibration par HP (gain, délai, EQ) → Direct ou repli binaural → reverbe globale → volume master.

6. Sources académiques

  1. Pulkki, V. (1997). « Virtual Sound Source Positioning Using Vector Base Amplitude Panning ». Journal of the Audio Engineering Society, 45(6), 456–466. VBAP
  2. Pulkki, V. (1999). « Uniform Spreading of Amplitude Panned Virtual Sources ». Proc. IEEE Workshop on Applications of Signal Processing to Audio and Acoustics (WASPAA), New Paltz. MDAP / spread
  3. Berkhout, A. J., de Vries, D., & Vogel, P. (1993). « Acoustic control by wave field synthesis ». Journal of the Acoustical Society of America, 93(5), 2764–2778. WFS
  4. Gerzon, M. A. (1973). « Periphony: With-Height Sound Reproduction ». Journal of the Audio Engineering Society, 21(1), 2–10. ambisonie
  5. Daniel, J. (2000). Représentation de champs acoustiques, application à la transmission et à la reproduction de scènes sonores complexes dans un contexte multimédia. Thèse de doctorat, Université Paris 6. SN3D / HOA
  6. Nachbar, C., Zotter, F., Deleflie, E., & Sontacchi, A. (2011). « AmbiX — A Suggested Ambisonics Format ». Proc. Ambisonics Symposium, Lexington. ACN/SN3D
  7. Armstrong, C., Thresh, L., Murphy, D., & Kearney, G. (2018). « A Perceptual Evaluation of Individual and Non-Individual HRTFs: A Case Study of the SADIE II Database ». Applied Sciences, 8(11), 2029. DOI 10.3390/app8112029. HRTF
  8. ITU-R (2019). Recommendation ITU-R BS.2076-2 — Audio Definition Model. Union internationale des télécommunications, Genève. ADM
  9. ADM-OSC (spécification communautaire, depuis 2020). ADM-OSC: An industry initiative for standardization of Object-Based Audio positioning data in live production ecosystems. https://github.com/immersive-audio-live/ADM-OSC. ADM-OSC
  10. Catmull, E., & Rom, R. (1974). « A Class of Local Interpolating Splines ». Dans R. E. Barnhill & R. F. Riesenfeld (dir.), Computer Aided Geometric Design, Academic Press, 317–326. spline
  11. GRIS — Groupe de recherche en immersion spatiale, Université de Montréal. SpatGRIS (logiciel libre de spatialisation) — origine de l'algorithme MBAP (mode CUBE) porté dans ST4. https://gris.musique.umontreal.ca. MBAP

7. Licence

Sound Trajectory 4 est un produit TripinLab. Le dépôt ne publie pas de licence pour le produit lui-même : © TripinLab — tous droits réservés (voir l'éditeur). L'activation utilise le module de licence TripinLab (tl_licensing, composant première partie, vérification hors-ligne — seul la clé publique est embarquée).

Règle de distribution du projet : aucun composant copyleft (ni GPL ni LGPL) n'est lié au binaire distribué ; toutes les dépendances embarquées sont permissives. D'après le fichier de notices tierces du dépôt (desktop/THIRD_PARTY_NOTICES.md) :

ComposantRôleLicence
JUCE 8framework applicatif/audio double licence — AGPLv3 ou licence commerciale JUCE 8 ; la distribution d'un binaire fermé exige la licence commerciale, détenue par le distributeur
Signalsmith Stretchtime-stretch préservant la hauteur (mode « wsola ») MIT (vendorisé)
signalsmith-linearbackend FFT/STFT du stretch (+ framework Accelerate d'Apple sur macOS)MIT (vendorisé)
SADIE II KU100 HRTFHRIR mesurées pour le binaural (opt-in) Apache-2.0 — © 2018 University of York ; usage commercial autorisé avec attribution (Armstrong et al. 2018, cf. § 6)
tl_licensingclient LicenseHub TripinLabpremière partie / TripinLab
EBU libadmmodèle ADM (build optionnel, désactivé par défaut)Apache-2.0
EBU libbw64conteneur BW64 (build optionnel)Apache-2.0
Boostdépendance transitive de libadm (build optionnel)Boost Software License 1.0

Les anciens moteurs de time-stretch SoundTouch (LGPL) et Rubber Band (GPL) ont été retirés pour respecter la règle sans-copyleft.

8. Annexe — lexique OSC & ports

Ports par défaut

PortSensRôle
9000entrantcommande générale (tout le lexique ci-dessous ; accepte aussi /adm/obj/… sans acquittement)
9001sortantréponses et acquittements (/st/…)
9100sortantADM-OSC out (positions vers un renderer externe)
9101entrantADM-OSC in (console → positions de pistes)

Verbes principaux

AdresseArgumentsEffet
Transport
/transport/play · /transport/stop—lecture / arrêt
/transport/seekratio 0…1positionner la tête de lecture
/transport/loop0|1bouclage
Mix & paramètres
/set/mastergainvolume master
/set/trackVolumeid, gainfader d'une piste (temps réel, sans rebind)
/set/trackMute · /set/trackSoloid, 0|1mute / solo d'une piste
/set/trackSendid, slot 1–4, niveau 0–1envoi d'une piste vers un slot de reverbe
/set/groupnom, volume|mute|solo|send1…send4, valeurtranche de groupe (créé au premier contact)
/set/reverbSlotslot 1–4, actif 0|1, mix 0–1, decay s, preset, follow 0|1configuration d'un slot de reverbe (follow : 0 = fixe, 1 = suit)
/set/reverbactif 0|1, mix, decay, presetreverbe globale
/reverb/irBuffer · /reverb/ir/clearbase64 | —IR personnalisée / retour au preset
/set/listenerx, y, zposition du listener
/set/paramchemin.pointé, valeurtout paramètre scalaire continu (track.<id>.volume|geomScale|geomRotation|azimuthSpan|elevationSpan|spread|sourceDirectivity|sourceSpin|sourceOrientationAz/El, listener.x|y|z, reverb.mix|decay, clip.<id>.<n>.gain, playbackSpeed…)
/set/timestretchModeresample|wsolavarispeed / préservation de hauteur
/set/binauralmeasured|syntheticchoix de la HRTF binaurale
/set/stateJSON de sessionpousser la session complète
Fichiers & rendu
/file/open · /file/load · /file/loadBuffer— | chemin | id nom base64charger de l'audio
/project/save · /project/open · /file/save…projets
/render/offline · /render/adm[chemin]bounce WAV multicanal / export ADM (build optionnel)
Réseau & contrôle externe
/net/osc/start[port] [hôte réponse] [port réponse]ouvrir l'OSC-in (défauts 9000 / 127.0.0.1 / 9001) ; persiste
/net/osc/stop—fermer l'OSC-in
/net/adm/listen[port] (0 = stop)écoute ADM-OSC in (défaut 9101) ; persiste
/net/adm/connect · /net/adm/disconnect[hôte] [port]ADM-OSC out (défaut 9100)
/net/midi/start · /net/midi/stop · /net/midi/devices[identifiant]entrée MIDI (sans identifiant : tous les périphériques)
/net/stop—panique : tout couper (sockets + MIDI), persisté OFF
ADM-OSC (positions d'objets)
/adm/obj/<n>/x|y|zfloat −1…1position cartésienne de l'objet n (in et out)
/adm/obj/<n>/azim|elev|distdegrés, degrés, 0…1position polaire (un axe par message ; fusion AED côté in)
Entrées, sampler, MIDI
/input/enable0|1ouvrir/fermer la capture d'entrée carte son
/track/inputMonitorid, 0|1monitoring d'entrée transport arrêté (soundcheck)
/track/originid, input|stsend|seqorigine du signal de la piste
/sampler/triggertrackId [index]déclencher un pad (one-shot)
/sampler/notecanal 1–16, note 0–127 [, vélocité]note-on par le keymap des pads
/sampler/addSamples…charger des samples sur un pad
/sampler/panic · /sampler/panic/learn— | note|cc|offcouper toutes les voix / assigner la commande
/midi/learnchemin de paramètre (ou off)armer : le prochain CC reçu est lié à ce paramètre
/midi/unlearn · /midi/mapscc | —retirer un mapping / publier la table
/midi/cccc 0–127, valeur 0–127injecter un CC (même chemin que le matériel)
Requêtes & divers
/get/transport · /get/levels—répondent sur 9001 (/st/transport, /st/levels)
/audio/settings—ouvrir le sélecteur de périphérique/buffer
/license/status · /license/activate · /license/deactivate · /license/open[clé]gestion de la licence
/arb/config · /arb/lock…arbitrage des sources de contrôle (web / OSC / MIDI)

Raccourci essentiel

Espace : lecture/arrêt. Dans la scène 3D : glisser = déplacer, Alt+glisser = hauteur. Sur le badge N° du chutier : clic = couleur, glisser = réordonner.