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.
Deux éditions, un seul modèle
- Édition desktop (native) — l'application embarque l'interface web dans une WebView JUCE et fait tourner un moteur audio natif C++ derrière. Le natif est l'unique autorité audio : il calcule toute la spatialisation (MBAP/VBAP/WFS + ambisonie), le mixage, la calibration de sortie, l'automation et la modulation ; il ouvre directement l'interface audio multicanale (>2 canaux, faible latence) ; il possède la tête de lecture. L'interface web n'est qu'une vue et un contrôleur : elle envoie des ordres (un vocabulaire OSC) et reçoit la télémétrie (tête de lecture, niveaux) en retour.
- Édition web (navigateur) — la même interface, avec un moteur Web Audio. Plus légère, elle porte quelques spécialités (collaboration multi-utilisateur, VR WebXR) mais est contrainte par le navigateur : ambisonie plafonnée à l'ordre 4 (32 canaux Web Audio), pas de rack de reverbes natif, sortie limitée aux canaux que le navigateur expose.
Ce que ST4 sait faire
- Spatialiser N pistes (mono → multicanal, jusqu'à des sources de 144 canaux en natif) sur un rig arbitraire de haut-parleurs, selon trois modèles de panning : MBAP (défaut), VBAP, WFS — plus un décodeur ambisonique AmbiX (ordres 1 à 11) pour les pistes qui transportent un champ, et un repli binaural (HRTF mesurée SADIE II KU100 ou modèle synthétique).
- Séquencer : timeline à clips, automations, trajectoires jouées dans le temps, boucle, marqueurs, time-stretch (varispeed ou préservation de la hauteur), sampler à 16 pads pilotable au clavier MIDI.
- Mixer : table de mix avec groupes, mute/solo composés, 4 départs de reverbe à convolution (chaque slot « fixe dans la salle » ou « suiveur de la tête »).
- Dialoguer : ADM-OSC entrant et sortant (consoles, moteurs de rendu externes), OSC de commande générale, MIDI Learn sur n'importe quel paramètre, langage de script en français.
- Calibrer : gain, délai et EQ par haut-parleur, appliqués avant la sortie.
2. L'interface, panneau par panneau
2.1 Le chutier de pistes
La colonne de gauche liste les pistes sous forme compacte, deux lignes par piste :
- Ligne 1 — le badge N° (il porte la couleur de la piste : un clic ouvre la palette, un glissement réordonne les pistes), le nom, les boutons M (mute) et S (solo), et le bouton Setup qui ouvre la fiche de la piste (§ 2.2).
- Ligne 2 — le slider de volume, avec le VU-mètre peint directement dans la rainure du slider : le niveau se lit sans colonne supplémentaire.
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 regroupe tout ce qui définit d'où vient le signal de la piste et comment il est adressé :
- Type d'entrée — Externe (capture de la carte son), Interne (la timeline : clips et fichiers), STbridge (flux temps réel venant du plug-in STtracks inséré dans une STAN/DAW).
- Nb canaux — le nombre de canaux de la piste (il définit les colonnes de la matrice ; 0–32 dans le navigateur, jusqu'à 144 en natif).
- Mode de source — comment les canaux sont posés et orientés (normal, barycentre, le long de la trajectoire ×2 — § 3.2).
- Entrée AmbiX — cochez pour traiter les canaux d'entrée comme des composantes ambisoniques ACN/SN3D et les décoder vers le rig (l'ordre est imposé par le nombre de canaux : 4 ch → ordre 1, 9 → 2, 16 → 3, 25 → 4… 144 → 11 ; le navigateur plafonne à l'ordre 4, le natif monte à 11).
- Index ADM-OSC out — l'index d'objet (1-based) sous lequel la position de la
piste est émise vers l'extérieur (une piste de C canaux occupe les index consécutifs
i…i+C−1). - Index ADM-OSC in — l'index d'objet écouté : au-dessus de 0, la position de la piste est pilotée par la console externe et sa trajectoire est ignorée (rendu et affichage). 0 = ne pas écouter.
- Index d'entrée carte son — le premier canal physique de la fenêtre d'entrée (type Externe).
- Matrice d'entrée — le routage canaux source → canaux de piste ; le bouton Matrice globale ouvre la vue d'ensemble (§ 2.3).
2.3 Le gestionnaire de pistes et la matrice globale
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 rassemble le mixage « console » :
- Tranches de pistes — fader, mute/solo, champ groupe (tapez un nom : le groupe est créé à la volée), et les 4 envois R1–R4 vers les slots de reverbe.
- Tranches de groupes — un fader, mute/solo et des envois par groupe. Le gain effectif d'une piste est le produit piste × groupe ; une piste est muette si elle ou son groupe l'est ; le solo est composé de même (§ 3.3).
- Rack de reverbes — 4 slots à convolution, chacun avec activation, niveau de retour, choix Fixe (dans la salle) ou Suit le listener, preset d'IR et temps de decay (§ 3.4).
2.5 La scène 3D
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
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 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
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 :
| Mode | Placement | Orientation |
|---|---|---|
| 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 :
- Gain : gain effectif = volume de piste × volume de groupe (× la lane d'automation de volume si elle existe).
- Mute : la piste est muette si elle l'est ou si son groupe l'est.
- Solo : dès qu'un solo existe quelque part (piste ou groupe), seules sonnent les pistes soloïsées elles-mêmes ou dont le groupe est en solo.
- Envois : envoi effectif vers le slot b = clamp(envoi de piste + envoi de groupe, 0, 1).
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 :
- FIXE (dans la salle) — le mouillé est injecté avant le repli binaural, dans le domaine des haut-parleurs (réparti sur les N enceintes avec un gain mix/√N, diffus et sain en énergie). Conséquence perceptive : la réverbération est localisée dans la salle — si le listener tourne la tête, elle tourne avec la salle, pas avec lui.
- SUIT (le listener) — le mouillé est ajouté après le repli, directement sur le bus de sortie : il est verrouillé à la tête et suit le listener partout. C'est le comportement d'une reverbe « au casque » classique.
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'interface | Terme technique | Ce 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.
- MBAP (Matrix-Based Amplitude Panning, défaut) — hérité de SpatGRIS (mode CUBE) : un champ de gains par distance, calculé analytiquement, avec exposant de diffusion (1–8), gestion des spans azimut/élévation, et compensation d'énergie vers le centre. Robuste pour des rigs arbitraires, y compris avec des sources dans le volume. Formules au § 5.7.
- VBAP (Vector Base Amplitude Panning, Pulkki 1997) — variante 2D/horizontale : la paire d'enceintes qui encadre l'azimut de la source est résolue en gains barycentriques positifs, normalisés à puissance constante (Σg²=1). Le spread déclenche un éventail MDAP (Pulkki 1999) de sources virtuelles sur ±spread·180°, pour éclairer plus que la paire. La hauteur (z) est ignorée pour la sélection de paire — simplification documentée, adaptée aux couronnes et dômes du logiciel ; le VBAP 3D par triplets (triangulation d'enveloppe convexe) n'est volontairement pas implémenté.
- WFS (Wave Field Synthesis, d'après Berkhout et al. 1993) — modèle simplifié
amplitude+délai d'une source ponctuelle virtuelle : gain ∝ 1/√r (loi d'amplitude 2.5D) pondéré
d'un terme d'obliquité max(0, cos θ) (sélection des sources secondaires), délais τ = Δd/c
référencés à l'enceinte la plus proche. Ce n'est pas une fonction de pilotage WFS
complète (pas de pré-filtre en phase stationnaire ni de traitement du repliement spatial) — c'est
une saveur perceptive assumée, documentée comme telle dans le code.
Précision du 7 août 2026 : les délais existent désormais aux deux éditions. Jusque-là ils étaient calculés puis jetés côté desktop — la WFS native n'était qu'une loi d'amplitude, sans le front d'onde qui la définit. En desktop, le Doppler ne s'ajoute plus à la WFS (c'est la même grandeur physique, le temps de vol), et le retard tenu est plafonné à 0,25 s (soit une salle d'environ 86 m).
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 :
- Synthétique (défaut) — modèle analytique de tête sphérique (ITD + ombre de tête passe-bas + ILD), sans fichier.
- Mesuré — SADIE II KU100 — le jeu de HRIR mesurées de l'Université de York
(tête artificielle Neumann KU100 : 37 azimuts × 9 élévations de −45° à +75°, 256 taps à 48 kHz).
Interpolation linéaire en élévation, anneau d'azimut au plus proche, niveau ancré sur le kernel
frontal. Sélection par
/set/binaural measured|syntheticou dans les préférences.
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.
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 :
- Sortant (vers un moteur de rendu externe) — pour chaque objet n (1-based) :
/adm/obj/<n>/x|y|z(cartésien −1…1) et/adm/obj/<n>/azim|elev|dist(polaire : degrés, degrés, 0…1). Port par défaut 9100 (/net/adm/connect). - Entrant (depuis une console) — les mêmes adresses pilotent la position de la
piste dont la fenêtre Index ADM-OSC in couvre l'objet n (une piste de C canaux écoutant
l'index i possède les objets i…i+C−1). Un axe par message ; les axes polaires fusionnent via un
cache AED amorcé de la position courante (un
/azimseul orbite à distance constante). Une piste écoutée ignore sa trajectoire. Port dédié 9101 (/net/adm/listen) ; les mêmes messages sont aussi interceptés sur le port de commande 9000.
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
- Créer la piste. Chutier → + Nouvelle Piste (mono). Nommez-la « Voix » (double-clic sur le nom).
- Charger le son. Glissez votre fichier sur la carte de la piste (ou Parcourir dans sa rangée de timeline).
- 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.
- 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.)
- Boucler et jouer. Définissez la boucle sur la rangée Boucle, puis Espace.
4.2 Un chœur multicanal « le long de la trajectoire »
- 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.
- Dessiner un chemin. Une longue courbe qui serpente à travers la salle (ouverte ou fermée — les deux marchent).
- Choisir le mode. Setup → Mode de source → « Le long de la trajectoire ».
- Vérifier dans la scène : les 8 chanteurs s'égrènent sur le chemin, à écart constant (1/8 du chemin entre voisins).
- Jouer en animant la progression (comme en 4.1, étape 4).
4.3 Mixer par groupes, avec une salle fixe et une reverbe suiveuse
- 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.
- Configurer R1 = la salle. Rack de droite, slot Reverb 1 : EN, preset hall, decay ≈ 2,5 s, mode Fixe (dans la salle), retour ≈ 30 %.
- Configurer R2 = l'aura. Slot Reverb 2 : EN, decay court (≈ 1 s), mode Suit le listener.
- 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.)
- É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).
- Tourner la tête. En binaural, faites pivoter le listener (ou déplacez-le).
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.
- 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. - 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.
- Envoyer depuis la console (un axe par message, floats) :
Les axes polaires fusionnent : un/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/azimseul fait orbiter la source à distance constante, depuis sa position courante. - 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|distpour chaque objet, l'index de départ de chaque piste étant son Index ADM-OSC out. - 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).
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 (sens antihoraire depuis +X, dans le plan horizontal), élévation . Harmoniques réelles, ordre des canaux ACN, normalisation SN3D (semi-normalisation de Schmidt), sans phase de Condon–Shortley :
où 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) :
(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 :
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) :
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 :
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) :
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) :
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) :
Sans span, avec E l'exposant de diffusion (1–8, défaut 2) et dk la vraie distance source→enceinte en espace normalisé :
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‖) :
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) :
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 :
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
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
- Pulkki, V. (1997). « Virtual Sound Source Positioning Using Vector Base Amplitude Panning ». Journal of the Audio Engineering Society, 45(6), 456–466. VBAP
- 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
- 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
- Gerzon, M. A. (1973). « Periphony: With-Height Sound Reproduction ». Journal of the Audio Engineering Society, 21(1), 2–10. ambisonie
- 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
- Nachbar, C., Zotter, F., Deleflie, E., & Sontacchi, A. (2011). « AmbiX — A Suggested Ambisonics Format ». Proc. Ambisonics Symposium, Lexington. ACN/SN3D
- 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
- ITU-R (2019). Recommendation ITU-R BS.2076-2 — Audio Definition Model. Union internationale des télécommunications, Genève. ADM
- 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
- 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
- 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) :
| Composant | Rôle | Licence |
|---|---|---|
| JUCE 8 | framework 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 Stretch | time-stretch préservant la hauteur (mode « wsola ») | MIT (vendorisé) |
| signalsmith-linear | backend FFT/STFT du stretch (+ framework Accelerate d'Apple sur macOS) | MIT (vendorisé) |
| SADIE II KU100 HRTF | HRIR 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_licensing | client LicenseHub TripinLab | première partie / TripinLab |
| EBU libadm | modèle ADM (build optionnel, désactivé par défaut) | Apache-2.0 |
| EBU libbw64 | conteneur BW64 (build optionnel) | Apache-2.0 |
| Boost | dé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
| Port | Sens | Rôle |
|---|---|---|
| 9000 | entrant | commande générale (tout le lexique ci-dessous ;
accepte aussi /adm/obj/… sans acquittement) |
| 9001 | sortant | réponses et acquittements (/st/…) |
| 9100 | sortant | ADM-OSC out (positions vers un renderer externe) |
| 9101 | entrant | ADM-OSC in (console → positions de pistes) |
Verbes principaux
| Adresse | Arguments | Effet |
|---|---|---|
| Transport | ||
/transport/play · /transport/stop | — | lecture / arrêt |
/transport/seek | ratio 0…1 | positionner la tête de lecture |
/transport/loop | 0|1 | bouclage |
| Mix & paramètres | ||
/set/master | gain | volume master |
/set/trackVolume | id, gain | fader d'une piste (temps réel, sans rebind) |
/set/trackMute · /set/trackSolo | id, 0|1 | mute / solo d'une piste |
/set/trackSend | id, slot 1–4, niveau 0–1 | envoi d'une piste vers un slot de reverbe |
/set/group | nom, volume|mute|solo|send1…send4, valeur | tranche de groupe (créé au premier contact) |
/set/reverbSlot | slot 1–4, actif 0|1, mix 0–1, decay s, preset, follow 0|1 | configuration d'un slot de reverbe (follow : 0 = fixe, 1 = suit) |
/set/reverb | actif 0|1, mix, decay, preset | reverbe globale |
/reverb/irBuffer · /reverb/ir/clear | base64 | — | IR personnalisée / retour au preset |
/set/listener | x, y, z | position du listener |
/set/param | chemin.pointé, valeur | tout 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/timestretchMode | resample|wsola | varispeed / préservation de hauteur |
/set/binaural | measured|synthetic | choix de la HRTF binaurale |
/set/state | JSON de session | pousser la session complète |
| Fichiers & rendu | ||
/file/open · /file/load · /file/loadBuffer | — | chemin | id nom base64 | charger 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|z | float −1…1 | position cartésienne de l'objet n (in et out) |
/adm/obj/<n>/azim|elev|dist | degrés, degrés, 0…1 | position polaire (un axe par message ; fusion AED côté in) |
| Entrées, sampler, MIDI | ||
/input/enable | 0|1 | ouvrir/fermer la capture d'entrée carte son |
/track/inputMonitor | id, 0|1 | monitoring d'entrée transport arrêté (soundcheck) |
/track/origin | id, input|stsend|seq | origine du signal de la piste |
/sampler/trigger | trackId [index] | déclencher un pad (one-shot) |
/sampler/note | canal 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|off | couper toutes les voix / assigner la commande |
/midi/learn | chemin de paramètre (ou off) | armer : le prochain CC reçu est lié à ce paramètre |
/midi/unlearn · /midi/maps | cc | — | retirer un mapping / publier la table |
/midi/cc | cc 0–127, valeur 0–127 | injecter 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.