Un code musical.
#!/bin/bash ######################################################### # _____ # # / / \ \ # # / /| |\ \ ATTENTION! # # / / | | \ \ Ce script a de fortes chances # # / / |_| \ \ de rendre votre système instable, # # /_/ (_) \_\ et de causer un sacré bazard. # # # # À EMPLOYER AVEC LES PLUS GRANDES PRÉCAUTIONS ! # # # # Pour l’exécuter, les habituels # # chmod +x mu0l_0102_hARCHIE.sh # # ./mu0l_0102_hARCHIE.sh # # devraient faire l’affaire. # # # ######################################################### ################################################################################### # # Salut, # # Normalement, une fois que ce script aura été exécuté, tu n’auras plus # sur ton disque qu’un titre -- unique ! -- nommé hARCHIE.flac. # Ce titre, ainsi que sa couverture et ses méta-données, sont uniques # à l’execution de ce script, et constitueront ton interprétation de # ce morceau (ou celle de ton ordinateur, ça dépends comment tu vois # les choses). # # Il y a pas mal de chances pour que ce script ne fonctionne pas # bien, et que le dépanner soit quasiment impossible -- il est commenté, # mais il affiche aussi peu d’information que possible sur l’écran, # ce qui inclut les possibles messages d’erreurs des divers logiciels employés. # # D’ailleurs, sont employés: # - Divers outils « standards » de Linux (cat, sed, chmod, kill, rm, echo, wait, # mapfile, awk, shuf, head, tr, cut, xprop, date, whoami, hostname), # - Divers périphériques (/dev/urandom, /dev/null, # alsa_output.pci-0000_00_1b.0.analog-stereo.monitor), # - Des logiciels de son (espeak, pacat, sox, flac), # - Un logiciel de traitement d’image (import). # # Ont été utiles: # - http://www.kammerl.de/ascii/AsciiSignature.php # - https://www.shellcheck.net/ # - Les sites du réseau https://stackexchange.com/, notamment # - https://unix.stackexchange.com/a/28045 # - https://superuser.com/a/1158969 # - https://unix.stackexchange.com/a/216475 # - https://stackoverflow.com/q/9449417 # - https://unix.stackexchange.com/a/68323 # - https://stackoverflow.com/a/171041 # - https://stackoverflow.com/a/16329514 # - https://unix.stackexchange.com/a/230676 # - Les documentations des logiciels utilisés # # Voilà, en espérant que tu passes un bon moment, et que ça se passe bien. # Tu pourras retrouver plus d’informations à # https://micr0lab.org/mu0l_0102/ # ################################################################################### # # Création du script qui jouera la pièce. # hARCHIE=$(cat << 'EOF' #!/bin/bash # # On affiche et on dit le titre. # titre=$(cat <<'EOF' ,a8888a, 88 ,a8888a, 88 ,a8888a, ad888888b, ,8P"' `"Y8, 88 ,8P"' `"Y8, ,d88 ,8P"' `"Y8, d8" "88 ,8P Y8, 88 ,8P Y8, 888888 ,8P Y8, a8P 88,dPYba,,adPYba, 88 88 88 88 88 88 88 88 88 88 ,d8P" 88P' "88" "8a 88 88 88 88 88 88 88 88 88 88 a8P" aaaaaaaa 88 88 88 88 88 `8b d8' 88 `8b d8' 88 `8b d8' a8P' """""""" 88 88 88 "8a, ,a88 `8ba, ,ad8' 88 `8ba, ,ad8' 88 `8ba, ,ad8' d8" 88 88 88 `"YbbdP'Y8 "Y8888P" 88 "Y8888P" 88 "Y8888P" 88888888888 888888888888 88 db 88888888ba ,ad8888ba, 88 88 88 88888888888 88 88 d88b 88 "8b d8"' `"8b 88 88 88 88 88 88 d8'`8b 88 ,8P d8' 88 88 88 88 88 88,dPPYba, d8' `8b 88aaaaaa8P' 88 88aaaaaaaa88 88 88aaaaa ,adPPYba, 88,dPPYba, 88P' "8a d8YaaaaY8b 88""""88' 88 88""""""""88 88 88""""" I8[ "" 88P' "8a 88 88 d8""""""""8b 88 `8b Y8, 88 88 88 88 `"Y8ba, 88 88 88 88 d8' `8b 88 `8b Y8a. .a8P 88 88 88 88 888 aa ]8I 88 88 88 88 d8' `8b 88 `8b `"Y8888Y"' 88 88 88 88888888888 888 `"YbbdP"' 88 88 EOF ) espeak -s 10000 -a 200 -g 0 -p 99 "$titre" & # Tout au maximum. echo -e "$titre" wait # # On enregistre la liste des voix / accents disponibles # dans un tableau # mapfile -t tableau_des_langues < <(espeak --voice | awk '{ print $2 }') && # # On mélange les langues / accents dans le tableau. # Et on enlève la première ligne, qui est l’entête # dans les résultats. # mapfile -t tableau_des_langues < <(shuf -e "${tableau_des_langues[@]:1}") # # Tableau avec la liste des mouvements: # nom_des_mouvements=( "Préambule" # Comptera comme le mouvement 0. "Mouvement 1" "Mouvement 2 - Apothéose" "Mouvement 3 - Climax " "Mouvement 4 - Sagesse" "Mouvement 5 - Épisiotomie" ) # # Tableau avec les textes des mouvements: # texte_des_mouvements=( "Bonjour" "" "" "It's been a long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long time." "Une sélection de mots variés, qui sans doute à ce point ne seront de toutes façons pas compris." "Une incision pour laisser sortir ce qui reste." ) for mouvement in "${!nom_des_mouvements[@]}" do # Pour chaque numéro de mouvement… # On affiche un en-tête. echo -e "\n\n\n" for ((i = 0; i < ${#nom_des_mouvements[mouvement]} + 4; i++)) do echo -ne "#" done echo -e "\n# ${nom_des_mouvements[mouvement]} #" for ((i = 0; i < ${#nom_des_mouvements[mouvement]} + 4; i++)) do echo -ne "#" done echo -e "\n\n" # # On génère une hauteur, une vitesse, un nombre de processus parallèles, # un volume et un écart de temps entre les mots d’une façon plus ou moins # aléatoire. # pitch=$(((((RANDOM%5)+5)*((mouvement*10)+1)))) # Hauteur. Défaut est 50, min = 0, max = 99. speed=$(((((RANDOM%5)+5)*(32/(mouvement+1))))) # Vitesse. Défaut est 160, min = 80, max = 450. proc_par=$(((RANDOM%5)+2*(mouvement+1))) # Nombre de processus parallèles. volume=$(((((RANDOM%5)+5)*(mouvement+20)))) # Volume. Défaut est 100, min = 0, max = 200. gap=$(((((RANDOM%5)+1)+(mouvement+1)))) # Écart entre les mots. Défaut est 10ms. # # Génère un caractère aléatoire # mapfile -t carac < <(head /dev/urandom | tr -dc A-Za-z0-9 | head -c1) # # On construit une chaîne de caractères avec # le caractère préalablement choisi, de # taille un peu aléatoire, # chaine="" for ((k=0;k<=$(((RANDOM%(mouvement+5)+5) * (mouvement + 1)));k++)) do chaine+="${carac[0]} " done # # Si la longueur du texte du mouvement est 0, # alors le texte à dire est un chiffre entre 1 et mouvement, # sinon, on sélectionne ce texte. # if [ -z "${texte_des_mouvements[mouvement]}" ] then texte=$((RANDOM%(mouvement+1))) else texte="${texte_des_mouvements[mouvement]}" fi for lang in "${tableau_des_langues[@]}" do # Pour chaque accent / langue dans le tableau des langues… ((max=max%proc_par)); ((max++==0)) && wait # On exécute proc_par processus en même temps au plus. # Les deux commandes espeak, pour le texte à dire et la chaîne de caractère accompagnante: espeak -a $volume -v "$lang" -s $((speed*2)) -g $((gap / 2)) -p $pitch "$chaine" 2> /dev/null & espeak -a $volume -v "$lang" -s $speed -g $gap -p $pitch "$texte" 2> /dev/null & done done wait cat << EOF ################ # Fini - Merci # ################ EOF EOF ) echo "$hARCHIE" > hARCHIE.sh sed -i 's/^ //g' hARCHIE.sh chmod +x hARCHIE.sh # # On lance l’enregistrement, puis on joue la pièce. # pacat --record -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor > hARCHIE.raw & ./hARCHIE.sh && # # On capture l’écran, afin d’en faire la jaquette. # import -window "$(xprop - 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)" jaquette.png # # On termine l’enregistrement, et on le convertit au format wav, puis flac, # avec les étiquettes qui conviennent. # pids=$(pgrep pacat) kill "$pids" sox -t raw -r 44100 -e signed-integer -L -b 16 -c 2 hARCHIE.raw hARCHIE.wav && rm hARCHIE.raw flac --totally-silent --delete-input-file --picture jaquette.png --tag ARTIST="$(whoami)" --tag TITLE="hARCHIE.sh" --tag DATE="$(date '+%e/%B/%Y')" --tag GENRE="Script Core" --tag COMMENT="https://micr0lab.org/mu0l_0102/" --tag VERSION="$(whoami), le $(date '+%e %B %Y à %R')." --tag LICENSE="cc-by-nc-nd" --tag COPYRIGHT="cc-by-nc-nd" --tag LOCATION="$(hostname)" -o hARCHIE.flac hARCHIE.wav # # Enfin, on supprime tout, y compris ce fichier. # rm jaquette.png hARCHIE.sh mu0l_0102_hARCHIE.sh
Ces 270 lignes de codes (sh), executées dans un environnement proprement configuré, joue une pièce musicale unique d'environ trente minutes, en garde la trace sous format flac, puis s'auto-détruit.
Vous pouvez retrouver cette pièce, telle qu'executée sur un ordinateur quelconque, au téléchargement ci-dessous, et à l'écoute dans le lecteur.
Téléchargez (sh) Téléchargez (flac) Écoutez
Une œuvre sous licence art libre.