Sabliers Multiplayer : Un système de diffusion audio intelligent

Sabliers Multiplayer : Un système de diffusion audio intelligent

Le projet en bref

Sabliers Multiplayer est un système de contrôle audio avancé conçu pour les installations sonores et les performances multi-spatiales. Il permet de gérer 50 lecteurs audio stéréo indépendants et de les router dynamiquement vers 3 sorties stéréo (ou plus), le tout contrôlé via une API REST moderne.

Pourquoi ce projet ?

Dans le cadre d'installations artistiques ou de spectacles immersifs, il est souvent nécessaire de diffuser différents contenus audio dans plusieurs espaces simultanément. Sabliers est un développement custom dont la principal feature est de pouvoir être contrôlable via API REST.

Sabliers Multiplayer répond à ce besoin en offrant :

  • Flexibilité maximale : chaque lecteur peut jouer dans 1, 2 ou 3 salles simultanément
  • Contrôle simple : API REST accessible depuis n'importe quel appareil connecté
  • Performance : jusqu'à 50 fichiers audio différents en lecture simultanée
  • Intégration facile : compatible avec tous les environnements capables d'envoyer des requêtes HTTP

Architecture technique

Le système repose sur deux composants principaux :

1. Le moteur audio (Max/MSP)

Le cœur du système est construit dans Max/MSP 9, un environnement de programmation visuel spécialisé dans le traitement audio en temps réel. L'architecture utilise :

  • 50 instances de lecteur audio stéréo (2tkplayer.maxpat) fonctionnant en parallèle
  • Une matrice de routage multicanal (mc.matrix~ 50 3) pour la distribution vers les 3 sorties
  • Un système de gain individuel pour chaque lecteur et chaque sortie

2. Le serveur API (Node.js)

Un serveur HTTP intégré (server-bundle.js) expose toutes les fonctionnalités via une API REST documentée (OpenAPI 3.0). Il gère :

  • La communication bidirectionnelle avec Max/MSP
  • La validation des commandes
  • Le monitoring de l'état du système
  • Une interface Swagger pour la documentation interactive

Fonctionnalités clés

Contrôle granulaire des lecteurs

Chaque lecteur peut être contrôlé individuellement avec des commandes simples :

# Charger un fichier
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "preload", "args": ["/audio/ambiance.wav"]}'
# Activer la lecture en boucle
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "loop", "args": [1]}'
# Démarrer la lecture
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "start"}'

Routing dynamique multi-salles

Le point fort du système : chaque lecteur peut être routé vers n'importe quelle combinaison de salles :

# Diffuser le slot 1 dans les salles 1 et 3 uniquement
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "out", "args": [1, "on"]}'
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "out", "args": [3, "on"]}'

Contrôle de gain précis

Le système utilise une échelle de gain de 0 à 157, permettant un contrôle fin du volume :

  • 157 = +18 dB (maximum)
  • 128 = 0 dB (niveau nominal)
  • 0 = silence complet
# Régler le gain du slot à 0 dB
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "gain", "args": [128]}'

Cas d'usage concrets

Installation immersive 3 salles

Imaginez une exposition avec 3 espaces interconnectés. Vous souhaitez :

  • Une ambiance commune diffusée dans les 3 salles
  • Des éléments sonores spécifiques à chaque salle
  • Des transitions fluides quand un visiteur se déplace

Configuration :

# Ambiance globale (slot 1) → diffusée partout
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "preload", "args": ["/audio/drone-ambiant.wav"]}'
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "loop", "args": [1]}'
# Router vers les 3 salles
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "out", "args": [1, "on"]}'
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "out", "args": [2, "on"]}'
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 1, "command": "out", "args": [3, "on"]}'
# Éléments spécifiques (slots 2, 3, 4)
# Salle 1 : voix
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 2, "command": "preload", "args": ["/audio/voix-salle1.wav"]}'
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 2, "command": "out", "args": [1, "on"]}'
# Salle 2 : instrument
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 3, "command": "preload", "args": ["/audio/piano-salle2.wav"]}'
curl -X POST http://localhost:3000/slot \
  -d '{"slot": 3, "command": "out", "args": [2, "on"]}'
# Démarrer toutes les lectures
for i in {1..3}; do
  curl -X POST http://localhost:3000/slot \
    -d "{\"slot\": $i, \"command\": \"start\"}"
done

Intégration avec des capteurs

L'API REST permet une intégration facile avec d'autres systèmes :

  • Capteurs de présence (déclenchement automatique)
  • Applications mobiles (contrôle visiteur)
  • Systèmes de lumière (synchronisation audio/visuel)
  • Installation interactive (réponse en temps réel)

Monitoring et débogage

Le système offre un endpoint /status qui retourne l'état complet :

curl http://localhost:3000/status

Réponse JSON complète avec :

  • État de chaque slot (fichier chargé, lecture en cours, loop actif)
  • Configuration de routing pour chaque lecteur
  • Niveau de gain des sorties

Documentation interactive

Une interface Swagger est accessible à http://localhost:3000/swagger pour explorer l'API de manière interactive, tester les commandes et voir les schémas de réponse.

Déploiement

Le système peut être packagé en collective Max (fichier .mxf) pour une distribution facile. Le collective embarque :

  • Le serveur API
  • Tous les patchers Max nécessaires
  • La configuration par défaut

Un simple double-clic lance le système complet dans le runtime Max

Performances

Le système a été testé avec succès avec :

  • 50 fichiers audio lus simultanément
  • Routing dynamique sans interruption audio
  • Latence minimale sur les changements de configuration
  • Stabilité sur des sessions de plusieurs heures

Technologies utilisées

  • Max/MSP 9.0.1 - Moteur audio temps réel
  • Node.js - Serveur API intégré (via node.script)
  • Express.js - Framework HTTP
  • OpenAPI 3.0 - Documentation API
  • Swagger UI - Interface de documentation interactive

Limitations et contraintes

Par souci de transparence, voici les limites actuelles du système :

  • 3 sorties stéréo maximum (contrainte de contexte technique de dev) mais totalement adaptable
  • Contrôle du seek en millisecondes (pas de SMPTE)
  • Pas de DSP temps réel (EQ, reverb) - le système se concentre sur la diffusion, routing

Conclusion

Sabliers Multiplayer démontre qu'il est possible de créer des systèmes de diffusion audio complexes tout en gardant une API simple et accessible. Le choix de Max/MSP pour l'audio combiné à une API REST moderne offre le meilleur des deux mondes : performance audio professionnelle et intégration facile avec l'écosystème web.

Le projet est particulièrement adapté aux installations artistiques, aux performances immersives et à tout contexte nécessitant une diffusion audio multi-spatiale dynamique.


Projet : Sabliers Multiplayer

Version : 2.0.0

Licence : Scordatura © 2025 - Tous droits réservés

Technologies : Max/MSP 9.0.7, Node.js, REST API