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\"}"
doneInté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/statusRé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