Configuration classique dans le développement informatique. Voilà l'annonce de l'hiver 2019 :
Tripoteca, festival du film et de l'art psychédélique, bientôt à Myrys. Une équipe poly-composite est déja passée à l'attaque pour représenter le peuple de la Halle avec des images qui piquent les yeux et des sons qui perforent les oreilles. C'est techniquement assez délicat à expliquer. [...]
Les quelques essais effectués à partir d'une bande son stéréo donnèrent des résultats encourageants. Mais, pour une raison indéterminée, les deux étapes suivantes, le N-pistes et la recherche de métriques utilisables, ne virent jamais le jour\dots
Janvier 2020, Tripoteca est fini, mais les affaires reprennent. Les lignes de code s'améliorent de jour en jour. Grace à une nouvelle méthode de travail, la seconde version du logiciel fait de grands progrès. En attendant, voici la dernière évolution du système à deux pistes qui va vous donner une idée de l'état actuel de la première version.
Le futur, c'était mieux avant.
tth@delirium:~/POV/Tripoteca $ soxi 8_Channel_ID.wav Input File : '8_Channel_ID.wav' Channels : 8 Sample Rate : 48000 Precision : 24-bit Duration : 00:00:08.05 = 386383 samples ~ 603.723 CDDA sectors File Size : 9.27M Bit Rate : 9.22M Sample Encoding: 24-bit Signed Integer PCM
La première étape du second prototype devrait nous donner la possibilité de gérer un nombre quelconque de pistes sonores. Aussitôt dit, aussitôt fait. En découpant le fichier en tranches de 1764 échantillons (ce qui équivaut à 1/25 seconde), nous obtenons une mesure des niveaux de chaque tranche de ces huit pistes de notre fichier sonore de test, en chiffres et en dessin :
96 0.000000 0.000000 0.000000 0.000000 0.000000 0.000040 0.000000 0.000000 97 0.000000 0.000000 0.000000 0.000000 0.000000 0.007411 0.000000 0.000000 98 0.000000 0.000000 0.000000 0.000000 0.000000 0.070500 0.000000 0.000000 99 0.000000 0.000000 0.000000 0.000000 0.000000 0.051347 0.000000 0.000000 100 0.000000 0.000000 0.000000 0.000000 0.000000 0.057567 0.000000 0.000000 101 0.000000 0.000000 0.000000 0.000000 0.000000 0.046691 0.000000 0.000000
Étape suivante : convertir ces métriques en données compréhensibles par POV, afin de pouvoir contruire une nouvelle kitchéo. Je ne sais pas comment faire, mais j'y songe sérieusement. stay tuned, film at eleven. J'aimerais une architexture modulaire, pour avoir la possibilité d'insérer des traitements auxiliaires dans le pipdeprod avec aisance et légèreté.
J'aime bien prendre des risques, aussi je vais tenter le premier jet avec Awk à partir du fichier généré à l'étape précédente. Premier avantage, permettre l'écriture de plugins, et deuxième avantage, un bon niveau de hack-value à l'ancienne. Par contre, il faut un peu de RTFM pour comprendre comment faire.
L'idée générale est d'avoir un morceau de Awk qui reçoit en argument un numéro de trame, et sur son entrée standard le contenu d'un fichier. Il est temps de faire appel à Christophe Blaess, chapitre 28, exemple_pipe_4.c, qui semble bien convenir à notre usecase du soir. Quoique, après réflexion, un plus classique popen(3) pourrait aussi faire l'affaire.
Essayons un peu avec les données obtenues au début, et un machin rapidement codé avec un peu de C, un peu de Bash, et notre plugin.awk :
Et en fait, oui, ça marche pas trop mal...
Abordons maintenant les gory details... Le code actuel (31 janvier 2020) est vraiment bordélique, genre c'est un mille-feuille de patches. Un gros mélange qu'il faut débroussailer pour le rendre vraiment opérationnel.
Attention, tout cela est en perpétuelle évolution, et les fichiers de code que vous pourriez lire ne sont fournis qu'à titre d'exemple.
Pourquoi avoir choisi le langage interprété Awk ?
Parce que c'est un langage bien adapté à l'écriture de petits proggies qui est spécialisé dans le traitement de fichier de données tabulée, tel celui que nous avons obtenu à l'étape précédente. Dans l'exemple qui suit, nous avons quatre parties distinctes :
Exemple :
#!/usr/bin/awk -f BEGIN { count = 0; avglevel = 0.0; printf "// GENERATED FILE - DO NOT EDIT BY HAND\n" printf "#declare FRAME = %d;\n", frame print "#declare A = array[8];" print "#declare B = array[8];" } { # on every input line count++; } $1==frame { printf "// $1 = %d\n", $1 for (foo=0; foo<8; foo++) { avglevel += $(foo+2) printf "#declare A[%d] = %f;\n", foo, $(foo+2) } printf "// average is %f\n\n", avglevel for (foo=0; foo<8; foo++) { printf "#declare B[%d] = %f;\n", foo, $(foo+10) } printf "\t\t//\n" } END { printf "#declare AvgLevel = %f;\n", avglevel printf "#declare COUNT = %d;\n", count printf "#declare NormClock = %f;\n", frame/count }
C'est tout pour le moment. Mais l'aventure continue. Ou continuera peut-être un jour quand nous aurons reconstruit un nouveau MACHIN. mai 2022 : c'est en bonne voie, le Tetalab a trouvé un nouveau foyer, dans le quartier des Minimes. Passez donc nous faire un coucou un mercredi soir.