OSC Table

Récupération des données de position des faders d’une table de mixage par message OSC via une communication ethernet entre un Arduino et MAX/MSP (projet open source).

On va appliquer un signal de référence à la table et on va mesurer la différence de tension entre ce signal et le signal de sortie de la table.

07 février 2011 :
- Achat de matériel chez Elak électronique (câbles, prises jack 6,35 femelle…)
- Prise en main de la table de mixage de test XENYX 1202FX : documentation…
- Mise en place de la communication entre un Arduino Diecimila et le programme MAX/MSP via le port série. Les données transférées : valeur du potentiomètre (de 0 à 1023) et valeur PWM envoyée à une LED (remplacée plus tard par la commande du moteur du fader) (de 0 à 255).

a) Programme à charger dans l’Arduino :
Initialisation :

Boucle principale :

b) Programme MAX/MSP :

L’objet serial va nous permettre de lire et d’écrire sur le port série. La lettre d correspond au COM4. En poussant sur le label print, on va afficher les ports disponibles dans la fenêtre d’exploitation de MAX avec la lettre leur correspondant. 9600 correspond au baud rate (même vitesse que dans le setup du programme Arduino).

On entre une donnée sur le port série en plaçant un byte à l’entrée de l’objet serial.
On lit en enclenchant la lecture (la donnée est reçue dans un buffer et est envoyée en sortie séquentiellement).

Formatage des données : en enclenchant respectivement les labels 1,2 et 3 ; on va afficher dans la fenêtre MAX les données brutes, les données groupées ou les données décodées.
Les données sont reçues sous forme d’entiers (données brutes), elles doivent être converties en caractères ASCII (espace = « 32 » ; à la ligne = « 13 10 »).
L’objet Zl group prend les valeurs ASCII et les groupes dans une liste. Cette liste est envoyée en sortie lorsqu’apparaît un « 13 » dans la ligne. En plus, le passage à la ligne est éliminé (« 10 »). (données groupées).
L’objet Iota va convertir les entiers en caractères ASCII et l’objet fromsymbol va différencier les 3 valeurs de la liste (grâce à l’espace entre eux). L’objet unpack va les séparer.

c) Mise en œuvre :

d) Mise en œuvre pour le fader de la table de mixage à la place du potentiomètre :

Signal carré généré par l’Arduino (0-5V) sur la sortie digitale 4,
Injection de ce signal sur l’entrée 5 de la table de mixage,
Récupération du signal de sortie sur la main out (canal de gauche uniquement),
Injection de ce signal sur l’entrée analogique A0 de l’Arduino,
Récupération de la valeur (0-1023) et activation de la sortie digitale 9 en PWM en fonction de la valeur récupérée.

Modification du programme Arduino :
Il va falloir générer un signal carré (car le continu est filtré par les capacités présentes dans la table de mixage.
La valeur du signal analogique récupérée devra être prise pendant l’intervalle de temps où le signal est à l’état haut.

15 Février :

A ce stade du travail, je suis capable de :

- Récupérer la tension en sortie d’une table de mixage (toujours la XENYX pour les tests) et en déduire la position d’UN fader (grâce à un signal-tension de référence 0-5V généré par l’Arduino et appliqué à l’entrée de la table.
- Transformer cette information en message OSC et l’envoyer sur le réseau par UDP (via le module Arduino Ethernet Shield).
- Récupérer le message OSC dans MAX/MSP et la rendre cohérente : le fader étant un potentiomètre logarithmique, on passe la valeur en dB (10 log(S/Sref)).
- Afficher la position du fader réel (mécanique) sur un Slider Max/Msp et jouer sur le niveau de sortie de la carte son (MBox).

Problèmes rencontrés :
- Lorsque j’ai essayé de récupérer des messages UDP dans MAX/MSP avec mon pc portable, rien ne se passait alors que je pouvais voir mes packets UDP transiter sur le réseau (via Wire Shark) !! Mon pc tourne sous Windows7, lorsque j’ai essayé avec une machine XP ça fonctionnait. Il est donc possible qu’il existe des problèmes d’incompatibilité. Mais étant donné que, ultérieurement nous allons travailler sur Mac OS ce n’est pas important.
- J’ai également eu des problèmes de valeur incohérentes (>1023 alors que c’est ma résolution, saut brusque de valeurs de tension…) J’ai résolu ce problème en simplifiant et en structurant mieux mon programme Arduino : Lecture de l’entrée analogique pendant l’alternance positive et envoi du message OSC pendant l’alternance « nulle ».
- Lorsque la valeur en tension récupérée en analogique devient trop importante, la table ce comporte comme un intégrateur et les valeurs récupérées sont envoyées en retard si on effectue une baisse brusque de niveau sur la table (latence trop élevée). Solution : augmenter la fréquence du signal afin de minimiser le caractère intégrateur de la table.

Arduino + Ethernet Shield et visualisation du signal A0:

Programme Arduino :
Initialisation + setup :

Boucle principale :

Programme MAX :

Extensions à 6 pistes : (17/02)
La librairie OSCClass utilisée précédemment ne permet malheureusement que 2 arguments maximum, or il nous en faudra 16.
Un changement de librairie est donc utile : nous allons utiliser ArdOSC développé par recotana (http://recotana.com/recotanablog/?page_id=222).
Nous allons générer un seul message osc avec l’information sur les 6 (plus tard16) Faders.
Le programme Arduino doit être modifié :

Adaptation dans MAX/MSP :

28.02 :
- Paramétrage de l’adresse IP : Nous devons être capable de changer l’adresse ip du board et l’adresse ip de l’ordinateur auquel il va s’adresser. Pour ce faire, nous allons passer par le port série :
Programme Arduino :

- Mise en place de l’écran LCD :
On va devoir utiliser la librairie liquidcrystal qui est incluse dans les librairies de bases de l’Arduino.
Afin de pouvoir afficher un bargraph correspondant à l’état dans lequel se trouve le Fader, on va utiliser la bibliothèque LcdBarGraph.
Cette librairie ne permt de faire uniquement un bargraph à partir de la ligne 0, colonne 0 . On va devoir la modifier :
lcdBarGraph.cpp :

On a rajouter deux paramètres en plus de value et maxvalue : col et line. Ces deux derniers vont intervenir dans le setCursor (initialement à 0,0). On va devoir préciser cela dans le fichier lcdBarGraph.h également :

La partie de programme affichant sur le LCD est la suivante
(Sans oublier un lcd.begin et un lcd.clear dans le setup) :

- Routage des pistes sonores dans MAX/MSP :
Commande de volume stéréo :

DSP status : drivers + entrées/sorties

03/03

Conception du boitier :

Achat d’un boitier de montage, usinage des faces avant et arrière (à l’emporte-pièce), fixation du board avec des vis en nylon (pour éviter les courts-circuits), fixation de l’écran LCD avec un décalage par rapport à la plaque d’aluminium (à l’aide d’écrous), fixation des connecteurs jack, des prises d’alimentation, USB et Ethernet.


04/03 :
Calibration et clarification du programme max/msp :

Le programme principal est composé de trois sub-patch :
- Un pour la réception des messages UDP
- Un pour le formatage des données à envoyer à la carte son
- Un pour router les données vers les bonnes pistes (dans notre exemple, on va mélanger 2 sons en stéréo).

Réception UDP : la sortie 1 affiche le nom du board en communication, la sortie 2 affiche le message OSC et les sorties 3 à 8 vont vers les 6 pistes.

Formatage des données : la calibration effectuée est effective pour la xenyx1202. La fonction logarithmique va nous donner une grande valeur négative lorsque x=0 et 0 lorsque x=1.
Le programme va gérer ces deux valeurs « parasite ». La sortie 1 envoie la donnée pour la carte son et la sortie 2 affiche le résultat sur un slider.

Routage des pistes : ce sub-patch va mélanger deux sons en stéréo en récupérant les volumes des faders.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>