Vous êtes à :
  1. Accueil > 
  2. mu0l_00102 - hARCHIE.sh
Passer le menu Aller au pied de page

Licences Joueb English version Accessibilité

hARCHIE.sh

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.

Contact Plan Lettre F.a.q. C.G.U.