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:47]
damien.muti [Programme Processing]
wiki:flossmanuals:bouton-jukebox-aleatoire:accueil [2021/05/20 15:59] (Version actuelle)
damien.muti [Programme Processing]
Ligne 120: Ligne 120:
  
   * jouer le son si le bouton est appuyé  et si le son ne joue pas déjà :   * 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 +    * 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.+    * 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) :   * sinon (i.e. si si le bouton est relâché ET que le son joue) :
-   * arrêter le son +    * 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.+    * 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.1619891277.txt.gz · Dernière modification: 2021/05/01 19:47 de damien.muti