Outils pour utilisateurs

Outils du site


wiki:tutoriels:processing:lecture-automatique-fichiers

Lecture automatique de fichiers dans un dossier

* Porteur(s) du projet : Damien MUTI (Prof. de Numérique)

  • Date : 03/2021
  • objectif : Lire de façon automatique des fichiers de n'importe quelle extension (images, sons, vidéos, textes, etc…), à partir d'un dossier contenant des fichiers et des sous-dossiers.
  • Contexte : Hacking Sonnerie
  • Fichiers :
  • Liens :

Algorithme

Lire de façon récursive les nom des fichiers ayant des extensions précisée en entrée de la fonction permettant la lecture des fichiers recherchés.

Programme

Le code Processing est le suivant : sonnerie_8_recherche_fichier.zip

/**  Le code est inspiré de celui des Affiches tactiles interactives - 
 *  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');
  }
}

//////////////////////////////////////////////// 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++;
  }
}

///////////////////////////////// Recherche des fichiers de façon récursive /////////////

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);
  }
}
wiki/tutoriels/processing/lecture-automatique-fichiers.txt · Dernière modification: 2022/03/28 18:11 de damien.muti