Tripoteca 2019

TL;DR

Le passé :

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

Le présent

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

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

Première étape

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

un beau graphique des niveaux
un beau graphique des fréquences

Deuxième étape

É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...

La technique

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.

Quelques fichiers à regarder

Makefile
Les recettes pour compiler les parties binaires. Il y a des options réglables. Ça cause aussi des dépendances.
runme.sh
Ce script est prévu pour recalculer la vidéo en cours. Il marche parfois.
functions.c
WIP. Des fonctions diverses, avec functions.h et metrics.h
n-pistes.c
Premier acte de la saison 2 : nous pouvons traiter beaucoup plus de données, puisque nous avons plein de pistes. Et c'est ce logiciel qui va utiliser les greffons.

Écrire un plugin

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.