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:48]
damien.muti [Programme Processing]
wiki:flossmanuals:bouton-jukebox-aleatoire:accueil [2021/05/20 15:59] (Version actuelle)
damien.muti [Programme Processing]
Ligne 125: Ligne 125:
     * 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.1619891294.txt.gz · Dernière modification: 2021/05/01 19:48 de damien.muti