Rawdodendron, convertisseur audio/image

Je regar­dais depuis quelques temps avec grand inté­rêt le tra­vail de Cécile Georges, une artiste qui tra­vaille le son et l’i­mage avec des pro­cé­dés auto­ma­tiques, explo­rant les défauts et les glitches des outils du numé­rique. En dis­cu­tant avec elle, j’ai appris qu’il lui arri­vait d’u­ti­li­ser auda­ci­ty pour char­ger une image au for­mat bmp, afin d’ap­pli­quer des­sus des algo­rithmes de trai­te­ment de son avant de sau­ver le fichier pour le visua­li­ser. L’oc­ca­sion de pro­duire des dis­tor­sions, d’ob­ser­ver, d’ex­pé­ri­men­ter plein de choses. Son pro­ces­sus impo­sait des étapes de mani­pu­la­tion atten­tives, pour ne pas cas­ser les entêtes du fichier image, cette par­tie qui per­met de relire ensuite le fichier comme une image.

En dis­cu­tant ensemble, on a conve­nu que ça pour­rait être faci­li­té, voire même que l’on pour­rait pro­po­ser le che­min inverse : lire un fichier son depuis un logi­ciel de trai­te­ment d’i­mages, lui appli­quer là aus­si des filtres et des effets, puis réécou­ter le fichier ensuite.

J’ai donc pris quelques jours, un week-end éten­du, et j’ai écrit en python un logi­ciel, raw­do­den­dron, qui per­met de faire de la trans­for­ma­tion auto­ma­tique de fichiers audio vers image, et réci­pro­que­ment. Le code source est bien sûr dis­po­nible en ligne sous licence libre, et j’ai pro­duit une courte vidéo de démons­tra­tion, où l’on écoute un son modi­fié grâce à gimp.

démons­tra­tion du fonc­tion­ne­ment de rawdodendron

Dans l’autre sens, on peut bien sûr conver­tir un fichier image en son, puis le modi­fier avant de reve­nir dans le visible.

Le logi­ciel est donc com­po­sé d’une inter­face où l’on peut glisser/déposer des fichiers, puis modi­fier les réglages de la conver­sion avant de géné­rer les fichiers de l’autre moda­li­té. L’in­ter­face est réglée pour auto­ma­ti­que­ment pré­pa­rer la conver­sion inverse. Cela per­met de faire de rapides allers/retours entre les deux moda­li­tés, pour expé­ri­men­ter un maxi­mum d’al­go­rithmes différents.

inter­face de rawdodendron

D’un point de vue tech­nique, l’ou­til mani­pule des images com­po­sées de pixels (png, jpg, etc), et des sons numé­riques (mp3, wav, flac, etc). J’en avais déjà par­lé dans un article dédié à la syn­thèse de son addi­tive, un son peut être modé­li­sé par une série de pressions/décompressions, et la manière de le sto­cker numé­ri­que­ment est de le décou­per selon une fré­quence très rapide (on parle par exemple de 44100 enre­gis­tre­ments par seconde pour le son d’un CD). On va alors sto­cker pour cha­cun de ces échan­tillons le degré de compression/décompression :

décou­page en échan­tillons d’un son

Ce sont cha­cun de ces échan­tillons qui seront conver­tis en pixels avec raw­do­den­dron. Car de la même manière que l’on code cette pression/décompression à l’aide d’un entier (com­pris entre ‑127 et 128 dans la ver­sion la plus simple), chaque pixel est codé par un entier entre 0 et 255 (dans sa ver­sion la plus stan­dard). Raw­do­den­dron va donc balayer l’i­mage de gauche à droite puis de haut en bas, et tra­duire bru­ta­le­ment (d’où le raw de raw­do­den­dron) les échan­tillons sonores en son, et réciproquement.

balayage de l’i­mage, pixel par pixel, ligne par ligne.

Dans l’i­mage ci-des­sus, on voit bien que deux pixels qui sont adja­cents peuvent se situer à de moments dif­fé­rents du son. La lar­geur de l’i­mage (ici notée x) entraîne un genre de « replie­ment tem­po­rel », le pixel t étant adja­cent au pixel t+x. On com­prend donc que la lar­geur de l’i­mage géné­rée à par­tir d’un son soit un para­mètre impor­tant, car sou­vent les filtres image modi­fient les pixels en fonc­tion de leurs voi­sins, qu’ils soient sur la même ligne hori­zon­tale ou non.

Dans l’ex­pli­ca­tion ci-des­sus, je n’ai par­lé ni du fait que les fichiers audio étaient sou­vent sté­réo, et que les fichiers image n’é­taient pas juste noir et blanc. Il y a donc 2 valeurs par échan­tillon de son, un pour l’o­reille droite, l’autre pour l’o­reille gauche. Sur les images, on a 3 valeurs (voire 4) pour chaque pixel, afin de com­po­ser le mélange rouge/vert/bleu (et par­fois trans­pa­rent). Le balayage va donc consi­dé­rer cha­cune des valeurs de pixel avant de pas­ser au pixel sui­vant, de même que consi­dé­rer chaque canal audio de l’é­chan­tillon avant de pas­ser au sui­vant. Cela peut entraî­ner des com­por­te­ments peu intui­tifs, et je conseille aux débu­tants avec ce logi­ciel de choi­sir des sons mono et des images en noir et blanc (et enre­gis­trés en niveau de gris) pour réus­sir à com­prendre un peu ce qui se passe.

Enfin, il est inté­res­sant de noter que les for­mats mp3 et jpg, conçus cha­cun pour réduire la taille des fichiers en rédui­sant la qua­li­té des don­nées sans que cela ne soit trop per­cep­tibles réduisent très per­cep­ti­ble­ment les don­nées dans l’autre moda­li­té (le mp3 est par­ti­cu­liè­re­ment agres­sif à l’œil). Pri­vi­lé­giez donc les for­mats non des­truc­tifs comme la flac et ou le png.