====== 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 : {{ :wiki:tutoriels:processing: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 nomDesSons ; java.util.List 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 rechercheTousLesSons() { ArrayList nomDesSons = new ArrayList(); // 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 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 listFilesRecursive(String dir) { ArrayList fileList = new ArrayList(); recurseDir(fileList, dir); return fileList; } // Recursive function to traverse subdirectories void recurseDir(ArrayList 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); } }