Lecture d’échantillon par OSC

Lecture d’échantillon commandée par message OSC

Cette réalisation consistait à externaliser la lecture des échantillons à l’aide d’une librairie autonome fonctionnant sous SuperCollider. L’utilisation de cette bibliothèque s’effectue par message OSC. Ceux-ci gèrent le contrôle de la diffusion d’échantillons sonores multipistes. En effet, selon Charles Bascou le Réalisateur en Informatique Musicale du GMEM, la lecture de fichiers multipistes directement sur le disque dur (direct to disk), sous Max/Msp, n’est pas fiable. Le logiciel provoque des coupures de lecture inopinées et aléatoires. De plus, lorsque le patch utilise beaucoup de ressource de la machine, la probabilité de dégradation augmente.

L’externalisation de la lecture des échantillons sonores de Max/Msp permet une diminution des problèmes, car moins de ressources sont utilisées par celui-ci, et augmente la qualité de service de la lecture. De plus, la gestion de la lecture par message OSC offre l’opportunité de décentralisé l’exécution sur un autre poste connecté en réseau.

Les spécifications, de cette librairie, sont de lire des échantillons sonores multipistes sans distinction, à l’aide des messages OSC suivant :

/preload intFile fileName
/play intLaunching intFile <floatfadeout(ms)>
/gain intLaunching floatDB <floatfade(ms)>
/stop intLaunching <floatfadeout(ms)>
/stopall <floatfadeout(ms)>
/maingain floatGainDB

Les paramètres entre < > sont facultatifs. Deux identifiants permettent la gestion de la lecture. L’un est attribué à un nom de fichier, fileName correspond au chemin absolue d’un ficher et à son nom. L’entier intFile désigne un fichier audio unique. Le second identifiant correspond à un numéro de déclenchement d’un fichier sonore (intLaunching). L’utilité de ces deux identifiants est de commander plusieurs lectures d’un même fichier de manière indépendante.

Le message /preload permet d’attribuer un identifiant unique (intFile) à un fichier sonore. Le message /play déclenche la lecture du fichier suivant un numéro de fichier et un numéro de déclenchement. On peut spécifier une intensité en décibel (floatDB) et un temps de fondu sonore en milliseconde (floatFadeOut). Le message /gain permet de modifier le gain d’un échantillon en cours de lecture en pointant l’indice de déclenchement. Le paramètre facultatif (floatFade) offre la possibilité d’effectuer cette modification de manière progressive. Le message /stop arrête la lecture d’un échantillon désigné par son numéro de déclenchement. De même, le paramètre facultatif de ce message paramètre le temps du fondu sonore. Le message /stopall commande l’arrêt de toutes les lectures en cours. Il possède aussi un paramètre facultatif de fondu sonore. Enfin, le message /maingain gère le niveau global de l’intensité sonore.

Pour réaliser cette librairie, je me suis appuyé sur une bibliothèque existante de SuperCollider. Celle-ci permet la lecture, directement sur le disque dur (direct to disk), de fichier multipiste (de 1 à 16 pistes). Cette librairie SuperCollider se nomme SoundFile. Toutefois, celle-ci ne répond pas à l’exigence de modifier le gain en cours de lecture (message /gain). Ainsi, j’ai dupliqué cette librairie et j’ai apporté les modifications répondant aux nécessités des spécifications.

Analyse de la librairie de lecture d’échantillons

La structure de cette bibliothèque repose sur deux variables globales. Elles ont pour type un tableau. L’index de ces tableaux correspond aux identifiants de la gestion de la lecture. Ainsi, suivant l’entier d’un fichier audio ou d’un déclenchement, nous pointons directement dans les tableaux pour exécuter l’action appropriée. Le message /preload centralise l’identification des fichiers audio dans le tableau centralisationFichers. Il teste la syntaxe du message. Si celle-ci est correcte, il teste l’existence du fichier et précharge le fichier, s’il existe. L’index du fichier (intFile) est utilisé comme index du tableau centralisationFichers, par cet index nous accédons directement à ce fichier.

OSCFunc({|msg|
if( msg.size != 3, {
("\n\tBad formatting of OSC message.").postln;
(" Usage => /preload intFile fileName").postln;
("Your message =>" + msg).postln;
}, {
if( File.exists(msg[2].asString.standardizePath), {
~centralisationFichiers.put(msg[1].asInteger, SoundFile2(msg[2].asString.standardizePath) );
("Preload :" + msg[2].asString.standardizePath).postln;
}, {
("This file" + msg[2].asString.standardizePath + "does not exist.").postln;
});
});
}, '/preload' );

Le message /play, après un test sur le format du message, recherche le fichier à lire dans le tableau centralisationFichers avec l’index du fichier. Dans un premier temps, il valide l’existence du fichier dans le tableau. Puis il démarre la lecture et affecte l’événement dans le tableau centralisationActions.

OSCFunc({|msg|
if( ((msg.size==3).or(msg.size==4).or(msg.size==5)).not, {
("\n\tBad formatting of OSC message.").postln;
(" Usage => /play intLaunching intFile <floatfadeout(ms)>").postln;
("Your message =>" + msg).postln;
}, {
if (~centralisationFichiers[msg[2].asInteger].notNil, {
switch (msg.size,
3, { ~centralisationActions.put(msg[1].asInteger, 0, ~centralisationFichiers[msg[2].asInteger].cue(playNow:true) );
~centralisationActions.put(msg[1].asInteger, 1, 0); },
4, { ~centralisationActions.put(msg[1].asInteger, 0, ~centralisationFichiers[msg[2].asInteger].cue((amp:msg[3].dbamp), playNow:true) );
~centralisationActions.put(msg[1].asInteger, 1, msg[3].dbamp); },
5, { ~centralisationActions.put(msg[1].asInteger, 0, ~centralisationFichiers[msg[2].asInteger].cue((amp:msg[3].dbamp, dr:msg[4]/1000), playNow:true) );
~centralisationActions.put(msg[1].asInteger, 1, msg[3].dbamp); }
);
},{
("At this index of file" + msg[2] ++ ", the sample not loaded.").postln;
});
});
}, '/play' );

Les autres messages sont conçus de la même manière et ils utilisent l’indice de déclenchement pour effectuer des actes uniquement sur le tableau centralisationActions. L’architecture de cette librairie repose sur une couche supplémentaire de contrôle afin de commander une bibliothèque endogène de SuperCollider. Le contrôle s’effectue par l’envoi de messages OSC. La couche supplémentaire interprète ces messages et utilise la librairie pour lire des échantillons sonores directement sur le disque dur.

Les différentes couches du système

Pour implémenter cette librairie, il est nécessaire d’installer SuperCollider en version égale ou supérieure à la 3.5, d’ajouter la bibliothèque de lecture sonore SoundFile2 dans le répertoire approprié aux librairies. Pour l’utiliser, il est nécessaire d’ouvrir, sous SuperCollider, le fichier des fonctions de réception et d’exécution des commandes. Celui-ci est configuré pour démarrer automatiquement. Toutefois, cette personnalisation fonctionne uniquement sous le système d’exploitation osX. Pour les autres systèmes, il est nécessaire d’exécuter la librairie manuellement. Après la phase de démarrage, SuperCollider fonctionne en tâche de fond. Il attend la réception de messages OSC, énoncés précédemment, pour lire un échantillon sonore.

Sébastien Clara – Juillet 2012

Publicités