Le traitement des sons est une tâche complexe qui peut être réalisée à l’aide de différents outils et logiciels. Mplayer est un outil puissant qui permet de lire des fichiers audio à partir d’une chaîne série. Dans cet article, nous allons vous montrer comment lire un fichier son avec Mplayer à la réception d’une chaîne sur le port série. Nous allons vous expliquer les étapes à suivre pour configurer Mplayer et le faire fonctionner correctement.
Processing Sons avec Mplayer : Lire un fichier son avec Mplayer à la réception d’une chaîne sur le port série
Explication
- Une chaine de caractères reçue sur le port série entraîne la lecture d’un fichier son par le logiciel Mplayer (Ubuntu) à l’aide d’une ligne de commande programmmée.
- La chaine de caractère utilisée sera le nom du fichier son placé dans le répertoire /home/utilisateur/Bureau/mes_sons (ou tout autre chemin à votre convenance).
- On pourra utiliser ce programme avec une carte Arduino connectée au port série, programmée avec un programme Arduino « miroir » qui renvoie telle que la chaine reçue. Tout autre programme Arduino envoyant une chaine sur le port Série correspondant à un fichier son déclenchera la lecture du son.
- Voir également : Jouer un fichier son avec Mplayer depuis Processing
Ressources utiles
- librairie GUI controlP5
- Pour plus d’infos :
- man mplayer dans le Terminal sous Ubuntu pour avoir la doc complète sur mplayer
- La page Ubuntu sur mplayer : http://doc.ubuntu-fr.org/mplayer
- le site officiel : http://www.mplayerhq.hu/design7/news.html
Le programme
- Copier/coller ce programme dans une interface Processing et enregistrer-le
- Mettre dans le répertoire indiqué dans le programme les fichiers sons utilisés. Les fichiers que j’ai utilisés sont ici
- Une fois fait, lancer le programme.
- Connecter une carte Arduino programmée avec le programme ci-dessous sur le port Série pour pouvoir saisir la chaine son de votre choix.
- Saisissez des chaines correspondant au nom du fichier son à jouer présent dans le répertoire du programme et le programme jouera ce son.
// généré avec le générateur de code Processing
// www.mon-club-elec.fr
// par X. HINAULT – Février 2011 – tous droits réservés
/////////////// Description du programme ////////////
// Utilise un/des objets String (chaîne de caractère)
// Utilise le port Serie
// Utilise la librairie GUI controlP5
// Utilise un/des bouton(s) simple(s) (Button)
// Utilise un/des champ(s) texte (Textfield)
// Ajoute un bouton et un champ pour chemin fichier
/*
Envoie vers Arduino une chaîne saisie dans un champ texte.
Reçoit la chaine renvoyée par Arduino et l’affiche dans la console.
Le fichier son voulu est joué en fonction de la chaine de caractères reçue
à l’aide d’une ligne de commande programmée qui lance le logiciel système Mplayer (Ubuntu)
*/
// XXXXXXXXXXXXXXXXXXXXXX ENTETE DECLARATIVE XXXXXXXXXXXXXXXXXXXXXX
// inclusion des librairies utilisées
import processing.serial.*; // importe la librairie série processing
import controlP5.*; // importe la librairie GUI controlP5
// cette librairie doit être présente dans le répertoire /libraries du répertoire Processing
// voir ici : http://www.sojamo.de/libraries/controlP5/
// déclaration objets
String chaineEnvoi = « »; // déclare un objet String (chaine de caractère)
// — port Série —
Serial myPort; // Création objet désignant le port série
// — interface GUI —
ControlP5 controlP5; // déclare un objet principal de la librairie GUI controlP5
Button envoiButton; // déclare objet Button
Textfield chaineText; // déclare des objets Textfield
// déclaration variables globales
//—— déclaration des variables de couleur utiles —-
int jaune=color(255,255,0);
int vert=color(0,255,0);
int rouge=color(255,0,0);
int bleu=color(0,0,255);
int noir=color(0,0,0);
int blanc=color(255,255,255);
int bleuclair=color(0,255,255);
int violet=color(255,0,255);
//—– pour lecture fichier sons avec mplayer —-
String[] command ; // pour envoi ligne de commande
String nomFichier=« »; // variable pour nom du fichier son à jouer
String cheminFichier=« /home/hinault/Bureau/mes_sons/ »; // chemin complet avec / de fin
//— chemin où se trouvent les fichiers sons – à adapter selon les cas —
// XXXXXXXXXXXXXXXXXXXXXX Fonction SETUP XXXXXXXXXXXXXXXXXXXXXX
void setup(){ // fonction d’initialisation exécutée 1 fois au démarrage
// —- initialisation paramètres graphiques utilisés
colorMode(RGB, 255,255,255); // fixe format couleur R G B pour fill, stroke, etc…
fill(0,0,255); // couleur remplissage RGB
stroke (0,0,0); // couleur pourtour RGB
rectMode(CORNER); // origine rectangle : CORNER = coin sup gauche | CENTER : centre
imageMode(CORNER); // origine image : CORNER = coin sup gauche | CENTER : centre
//strokeWeight(0); // largeur pourtour
frameRate(30);// Images par seconde
// — initialisation fenêtre de base —
size(400, 130); // ouvre une fenêtre xpixels x ypixels
background(0,0,0); // couleur fond fenetre
// — initialisation des objets et fonctionnalités utilisées —
//————- initialisation port série —-
println(Serial.list()); // affiche dans la console la liste des ports séries
// Vérifier que le numéro du port série utilisé est le meme que celui utilisé avec Serial.list()[index]
myPort = new Serial(this, Serial.list()[0], 115200); // Initialise une nouvelle instance du port Série
//myPort = new Serial(this, « /dev/ttyUSB0 », 115200); // Initialise une nouvelle instance du port Série
myPort.bufferUntil(‘\n‘); // attendre arrivée d’un saut de ligne pour générer évènement série
//======== Initialisation Objets GUI ControlP5 =========
controlP5 = new ControlP5(this); // initialise l’objet principal de la librairie GUI controlP5
// typeObjet nomObjet=controlP5.addObjet(paramètres); // pour info : déclaration / initialisation possible en 1 ligne
// Textfield field = controlP5.addTextfield(« myWindowTextfield »,70,130,100,20); // exemple
//======== Initialisation Objets Button =========
//—- le bouton envoi chaine
envoiButton=controlP5.addButton(« envoiButton »,0,width–60,height–40,50,24); // initialise et ajoute un Button au ControlP5
envoiButton.setLabelVisible(true); // affichage des labels
envoiButton.setLabel(« ENVOI »); // fixe label du bouton
envoiButton.setColorActive(color(255,0,0)); // fixe la couleur active
envoiButton.setColorForeground(color(0,255,255)); // fixe couleur avant
//======== Initialisation Objets Textfield =========
//—- champ texte saisie chaine
chaineText=controlP5.addTextfield(« cheminText »,10,height–40,300,20); // initialise et ajoute un Textfield au ControlP5
chaineText.setAutoClear(false); // autoeffacement après return
chaineText.setValue(chaineEnvoi); // initialise Texte du champ
chaineText.setLabelVisible(true); // affichage des labels
chaineText.setLabel(« CHEMIN »); // fixe label
chaineText.setColorActive(color(255,0,0)); // fixe la couleur active
chaineText.setColorForeground(color(0,255,255)); // fixe couleur avant
} // fin fonction Setup
// XXXXXXXXXXXXXXXXXXXXXX Fonction Draw XXXXXXXXXXXXXXXXXXXX
void draw() { // fonction exécutée en boucle
// tout se passe dans Serial Event
} // fin de la fonction draw()
// XXXXXXXXXXXXXXXXXXXXXX Autres Fonctions XXXXXXXXXXXXXXXXXXXXXX
//————- Fonction de gestion des évènements série —-
void serialEvent (Serial myPort) { // fonction appelée lors de la survenue d’un évènement série
// ******** Gestion de la valeur reçue sur le port série : **********
String inString = myPort.readStringUntil(‘\n‘); // chaine stockant la chaîne reçue sur le port Série
// saut de ligne en marque de fin
if (inString != null) { // si la chaine recue n’est pas vide
print (inString); // affichage brut de la chaine recue
//———— analyse de la chaine reçue et sélection son ——–
//String nomFichier= » »; // String pour nom fichier
//—– tous les noms de fichiers suivants seront reconnus et lancés en lecture
//—— les fichiers doivent dans le répertoire de la variable cheminFichier (voir début programme)
if (match(inString,« test_des_moteurs.mp3 »)!=null) nomFichier=« test_des_moteurs.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_moteur_gauche_avant.mp3 »)!=null) nomFichier=« test_moteur_gauche_avant.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_moteur_gauche_arriere.mp3 »)!=null) nomFichier=« test_moteur_gauche_arriere.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_moteur_droit_arriere.mp3 »)!=null) nomFichier=« test_moteur_droit_arriere.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_moteur_droit_avant.mp3 »)!=null) nomFichier=« test_moteur_droit_avant.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_moteur_droit_avant.mp3 »)!=null) nomFichier=« test_moteur_droit_avant.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_tourne_gauche.mp3 »)!=null) nomFichier=« test_tourne_gauche.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_tourne_droite.mp3 »)!=null) nomFichier=« test_tourne_droite.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_deux_moteurs_avant.mp3 »)!=null) nomFichier=« test_deux_moteurs_avant.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_deux_moteurs_arriere.mp3 »)!=null) nomFichier=« test_deux_moteurs_arriere.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« test_des_moteurs_fini.mp3 »)!=null) nomFichier=« test_des_moteurs_fini.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« r2d2_1.mp3 »)!=null) nomFichier=« r2d2_1.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« r2d2_2.mp3 »)!=null) nomFichier=« r2d2_2.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« r2d2_3.mp3 »)!=null) nomFichier=« r2d2_3.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« r2d2_4.mp3 »)!=null) nomFichier=« r2d2_4.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (match(inString,« r2d2_5.mp3 »)!=null) nomFichier=« r2d2_5.mp3 »; // test la chaine reçue et définit nom fichier son associé
if (nomFichier!=« ») { // si une chaine valide a été reçue
joueSonMplayer(cheminFichier, nomFichier); // appelle la fonction lecture son avec mplayer – sous Ubuntu
//— signale à Arduino fin son
myPort.write(‘H’); // envoie le caractère H sur le port Série pour signaler fin son
} // fin si chaine valide
} // fin condition chaine recue pas vide
} // fin de la fonction de gestion des évènements Série
// Gestion des évènements des objets GUI controlP5 —-
//—— fonction gestion globale des évènements GUI controlP5
public void controlEvent(ControlEvent theEvent) {
//println(theEvent.controller().name());// affiche le nom de l’évènement
}
//—- evenement bouton envoi chaine
void envoiButton(int theValue) { // fonction évènement Button de meme nom – reçoit la valeur
println(« Evènement envoiButton »);
myPort.write(chaineText.getText()+« \n« ); // envoie la chaine suivi saut ligne sur le port Série
print(« Envoi de la chaine : »);
print(chaineText.getText()+« \n« );
chaineText.setValue(« »); // vide le champ texte
} // fin evènement bouton envoi
// —— gestion évènement Textfield ——
//—- evenement champ texte chemin fichier
public void chaineText(String theText) { // fonction évènement Textfield de meme nom – déclenché par return – reçoit la chaine
//println(« Evènement CheminText avec valeur = « +theText);
chaineEnvoi=theText; // mémorise le contenu du champ
//println(« Le chemin est : »+chaineEnvoi);
} // fin evènement champ texte chemin fichier
//——————— fonction lecture son avec Mplayer —————
void joueSonMplayer(String cheminSon, String fichierSon) {
//—— code type pour jouer son avec mplayer par ligne commande (Ubuntu) —-
command = new String[3]; // tableau String pour la ligne de commande
// mplayer /home/hinault/Bureau/mes_sons/r2d2_2.mp3 -quiet
command[0] = « mplayer »;
command[1] = cheminSon+fichierSon;
command[2]=« -quiet »;
//— exécution de la ligne de commande (code Java)
try {
Process p = exec(command); // exécute la commande
//— récupère la sortie de la commande dans la console de Processing
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}//fin while
} // fin try
catch (IOException e) { // gestion exception
e.printStackTrace();
} // fin catch
} //——————— fin joueSonMplayer
//XXXXXXXXXXXXXXXXXX Fin du programme XXXXXXXXXXXXXXXXX
Articles similaires:
- Processing Sons avec la librairie Minim : Jouer un son à partir d’un fichier à la réception d’une chaîne de caractères sur le Port Série.
- EeePC-Bot : Interface Processing Mplayer + Espeaker + Envoi / Réception chaine série
- EeePC-Bot : Test simple des moteurs avec annonce sonore de l’action en cours (interface Processing utilisant le logiciel Mplayer appelé par ligne de commande programmée – Ubuntu)
- Saisir une chaîne dans un champ texte et l’envoyer vers le port Série
- EeePC-Bot : Test simple des moteurs avec annonce sonore de l’action en cours (interface Processing utilisant la libairie Minim)
Articles Liés
- Javascript : Graphique Dygraphs simple
Le Javascript est un langage de programmation très populaire et puissant qui permet aux développeurs…
- Javascript : Afficher 6 widgets graphiques fournis par une librairie graphique externe.
Le Javascript est un langage de programmation très populaire qui permet aux développeurs de créer…
- Javascript : Graphique Dygraphs : afficher date à partir unixtime
Le langage de programmation Javascript est très populaire et est utilisé pour créer des applications…