Outils pour utilisateurs

Outils du site


wiki:flossmanuals:bouton-jukebox-aleatoire:accueil

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
wiki:flossmanuals:bouton-jukebox-aleatoire:accueil [2021/05/01 19:20]
damien.muti
wiki:flossmanuals:bouton-jukebox-aleatoire:accueil [2021/05/20 15:59] (Version actuelle)
damien.muti [Programme Processing]
Ligne 105: Ligne 105:
 } }
 </code>  </code> 
-Ce programme est inspiré de l'exemple [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialCallResponse|SerialCallResponse]]+Ce programme est inspiré de l'exemple [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialCallResponse|SerialCallResponse]]
 + 
 +Lorsque le bouton est relâché, la led est éteinte et la carte envoie 0 via le port série. Lorsque le bouton on allume  la led et la carte envoie 255 via le port série. 
  
  
 ===== Programme Processing ===== ===== Programme Processing =====
-vidéos, photos du making of...+Les sons joués par Processing peuvent être mis dans le dossier "data" ou dans n'importe quel sous dossier contenu dans le dossier "data". Le programme Processing va répertorier automatiquement tous les fichiers sonores avec l'extension : 
 +  * **mp3** 
 +  * **aiff** 
 +  * **wave** 
 + 
 +Dans sa boucle de fonctionnement, le programme Processing récupère les données venant de la carte Arduino, via le port série. Cette opération s'inspire du programme [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialCallResponse|SerialCallResponse]]. Une fois les données récupérées, la méthode "gestionDuSon()" est appelée. 
 +l'algorithme de la gestion du son est le suivant : 
 + 
 +  * jouer le son si le bouton est appuyé  et si le son ne joue pas déjà : 
 +    * tester le compteur de sonnerie. Si le compteur est égal à zéro, tirer un son aléatoire dans la liste des sons 
 +    * lancer le son et incrémenter le compteur de sonnerie. 
 +  * sinon (i.e. si si le bouton est relâché ET que le son joue) : 
 +    * arrêter le son 
 +    * tester si le compteur d'itérations de sonnerie est supérieur à interationSonnerie (= 2 ici), le remettre à 0 si c'est le cas. 
 + 
 +Le programme Processing est le suivant : {{ :wiki:flossmanuals:bouton-jukebox-aleatoire:sonnerie_8_recherche_fichier.zip |}} 
 + 
 +sonnerie_8_recherche_fichier : 
 +<code> 
 +/**  Affiche tactile interactive -  
 +  Quand on appuie sur une touche (UP, DOWN, RIGHT, LEFT et espace ' '), cela lance une image, une vidéo, une annim, un son, etc... 
 + */ 
 +/// librairies 
 +import processing.sound.*; 
 +import processing.video.*;  
 +import processing.serial.*; 
 + 
 + 
 +// variables globales 
 +SoundFile son; // un son - un seul lecteur CD audio 
 +ArrayList <String> nomDesSons ; 
 +java.util.List<String> extensions; 
 + 
 +// bouton son actif ? 
 +boolean son_actif = false; 
 +float tempsDebutSon = 0; // temps du début de la musique a été joué 
 + 
 + 
 +/// dialogue avec la carte Arduino 
 +Serial myPort;  // Create object from Serial class 
 +boolean firstContact = false;        // Whether we've heard from the microcontroller 
 +int donneePortSerie; // entier converti de la chaine de caractère reçue sur le port série 
 + 
 +// compteur sonnerie 
 +int interationSonnerie = 2; 
 +int compteurSonnerie = 0; 
 +int indiceSon = 0; 
 + 
 +// debug 
 +boolean debug = false; 
 + 
 + 
 +void setup() { // initialisation des paramètres d'affichage & chargement des sons, vidéos, etc. 
 +  size(500, 500); 
 +  noStroke(); 
 +  background(0); 
 + 
 +  // chargement des nom des sons 
 +  String[] extensionsArray = {"wav", "aiff", "mp3"}; 
 +  extensions = java.util.Arrays.asList(extensionsArray); 
 + 
 +  nomDesSons = rechercheTousLesSons(); 
 + 
 +  son = new SoundFile(this, nomDesSons.get(0)); 
 + 
 +  /// Port série 
 +  // Print a list of the serial ports, for debugging purposes: 
 +  printArray(Serial.list()); 
 + 
 +  String portName = Serial.list()[0]; 
 +  myPort = new Serial(this, portName, 9600); 
 +
 + 
 +void draw() { 
 +  fill(0); 
 +  rect(0, 0, width, height); 
 +  fill(255); 
 +  text(donneePortSerie, 100, 100); 
 +
 + 
 +void serialEvent(Serial myPort) { 
 +  // lire la donnée sur la port série 
 +  int inByte = myPort.read(); 
 + 
 +  if (firstContact == false) { 
 +    if (inByte == 'A') {  
 +      myPort.clear();          // clear the serial port buffer 
 +      firstContact = true;     // you've had first contact from the microcontroller 
 +      myPort.write('A');       // ask for more 
 +      println("communication avec la carte Arduino établie"); 
 +    } 
 +  } else { 
 +    donneePortSerie = inByte; // lire la donnée et la stoquer dans inBuffer (chaine de caractères - String) 
 +    //debug 
 +    if (debug) { 
 +      println("bouton=" + donneePortSerie); 
 +    } 
 + 
 +    // tester la valeur du bouton et gérer le son 
 +    gestionSon(); 
 + 
 +    // envoyer 'A' à la carte Arduino pour nouvelle lecture du bouton 
 +    myPort.write('A'); 
 +  } 
 +
 +</code> 
 + 
 + 
 +La partie "gestion du son" est la suivante : 
 +<code> 
 +//////////////////////////////////////////////// Son /////////////////////////////////////////////////// 
 +void gestionSon(String nomDuSon) {  
 +  //if (donneePortSerie < seuil && donneePortSerie>0 && !son.isPlaying()) {  // son  
 +  // jouer le son SSI si le buton est appuyé  et si le son ne joue pas déjà 
 +  if (donneePortSerie == 255 && !son.isPlaying()) {  // son  
 +    // lancement du son 
 +    lancerSon(nomDuSon); 
 +  } else if (donneePortSerie == 0 && son.isPlaying()) { //si le bouton est relâché ET que le son joue : arrêter le son 
 +    son.stop(); 
 +  } 
 +
 +void gestionSon() { /// tirage aléatoire parmi la liste de son joué 2 fois 
 +  // jouer le son SSI si le bouton est appuyé  et si le son ne joue pas déjà 
 +  if (donneePortSerie == 255 && !son.isPlaying()) {  // son 
 +    // test du compteur de sonnerie 
 +    if (compteurSonnerie == 0){ 
 +      //tirer un son aléatoire dans la liste des sons 
 +      indiceSon = floor(random(0, nomDesSons.size()));     
 +    } 
 +    // lancement du son 
 +    lancerSon(nomDesSons.get(indiceSon)); 
 +    println(nomDesSons.get(indiceSon)); 
 +  } else if (donneePortSerie == 0 && son.isPlaying()) { //si le bouton est relâché ET que le son joue : arrêter le son 
 +    son.stop(); 
 +    // tester si le compteur d'itérations de sonnerie est supérieur à interationSonnerie (= 2 ici), le remettre à 0 
 +    compteurSonnerie = compteurSonnerie % interationSonnerie; 
 +  } 
 +
 +void lancerSon(String nomDuSon) { 
 +  if (!son.isPlaying()) { // le son ne joue pas 
 +    // chargement du son 1 
 +    son = new SoundFile(this, nomDuSon); 
 +    // jouer le son  
 +    son.loop(); 
 +    //incrémenter le compteur d'itérations de sonnerie 
 +    compteurSonnerie++; 
 +  } 
 +
 +</code> 
 + 
 + 
 +Enfin, la lecture automatique des fichiers son est gérée par le code suivant : 
 + 
 +<code> 
 +ArrayList<String> rechercheTousLesSons() { 
 +  ArrayList<String> nomDesSons = new ArrayList<String>(); 
 + 
 +  // Using just the path of this sketch to demonstrate, 
 +  // but you can list any directory you like. 
 +  String path = sketchPath(); 
 + 
 +  // recherche de tous les dossiers et fichiers dans le dossier du sketch parent 
 +  ArrayList<File> allFiles = listFilesRecursive(path); 
 + 
 +  // recherche de tous les fichiers ".wav" et ".aiff" 
 +  if (allFiles != null) {   
 + 
 +    // recherche de tous les fichiers son : .mp3, .aif, .wav 
 +    for (File f : allFiles) { 
 +      String fname = f.getName();  
 +      String fileExt = fname.toLowerCase().substring(fname.lastIndexOf('.') + 1) ; // récupérer l'extension du fichier 
 +      if (extensions.contains(fileExt)) { 
 +        // fname.toLowerCase().endsWith(".wav") || fname.toLowerCase().endsWith(".aiff") || fname.toLowerCase().endsWith(".mp3"
 +        nomDesSons.add(f.getAbsolutePath()); 
 +      } 
 +    } 
 +  } 
 + 
 +  //println("\nnom de tous les fichiers son: "); 
 +  //printArray(nomDesSons.toArray()); 
 +  //println("-----------------------"); 
 + 
 +  return nomDesSons; 
 +
 + 
 +// Function to get a list of all files in a directory and all subdirectories 
 +ArrayList<File> listFilesRecursive(String dir) { 
 +  ArrayList<File> fileList = new ArrayList<File>();  
 +  recurseDir(fileList, dir); 
 +  return fileList; 
 +
 + 
 +// Recursive function to traverse subdirectories 
 +void recurseDir(ArrayList<File> a, String dir) { 
 +  File file = new File(dir); 
 +  if (file.isDirectory()) { 
 +    // If you want to include directories in the list 
 +    a.add(file);   
 +    File[] subfiles = file.listFiles(); 
 +    for (int i = 0; i < subfiles.length; i++) { 
 +      // Call this function on all files in this directory 
 +      recurseDir(a, subfiles[i].getAbsolutePath()); 
 +    } 
 +  } else { 
 +    a.add(file); 
 +  } 
 +
 + 
 +</code> 
 + 
  
wiki/flossmanuals/bouton-jukebox-aleatoire/accueil.1619889611.txt.gz · Dernière modification: 2021/05/01 19:20 de damien.muti