Waveform

Il n’échappera à personne que je fais par ailleurs de la musique et que je la publie sur un de mes sites (http://habett.net). Pour avoir par ailleurs mis de la musique sur soundcloud j’observe que les formes d’ondes sont bien utiles pour comprendre et apprécier la structure du morceau. Reste que les waveforms de soundcloud sont extrêmement peu parlantes. J’ignore leur algorithme mais il est vraiment lénifiant et donne un résultat tellement peu expressif que je me suis très rapidement dit que je pouvais faire beaucoup mieux.

L’outil pour y procédé vas être un script bash avec quelques dépendances : sox, gnuplot et imagemagick. Le paramètre est le nom du fichier .wav à traiter sans son extension. Vous pouvez observer que je fais en fait deux waveforms que je combine à la fin dans  un composite, pour obtenir un représentation différentielles des fréquences utilisées par la musique en question, waveform plus sombre pour les basses et claire pour les aigus dominants.

#!/bin/sh

WAV=${1%.wav}
sox "$WAV" /tmp/test.wav lowpass 500

sox /tmp/test.wav --rate 1k /tmp/test.dat

rm /tmp/test.wav

grep -v '^;' /tmp/test.dat >/tmp/test.clean

perl -pe 's/.*/0 1 1\n0.0001 -1 -1/ if $. == 1' /tmp/test.clean > /tmp/test.norm

rm /tmp/test.dat

rm /tmp/test.clean

CMD="set terminal png transparent size 6400,1600; set noxtics;set tmarg 0;set bmarg 0;set lmarg 0;set rmarg 0;set noytics; set noborder;set nogrid;set nokey;set output '/tmp/test.png';plot '/tmp/test.norm' with impulses notitle lt -1"

 echo $CMD | gnuplot

rm /tmp/test.norm

convert /tmp/test.png -scale 1600x400 "$1.low.png"

rm /tmp/test.png

sox "$WAV" /tmp/test.wav highpass 300

sox /tmp/test.wav --rate 1k /tmp/test.dat

rm /tmp/test.wav

grep -v '^;' /tmp/test.dat >/tmp/test.clean

perl -pe 's/.*/0 1 1\n0.0001 -1 -1/ if $. == 1' /tmp/test.clean > /tmp/test.norm

rm /tmp/test.dat

rm /tmp/test.clean

echo $CMD | gnuplot

rm /tmp/test.norm

convert /tmp/test.png -negate -scale 1600x400 "$1.high.png"

rm /tmp/test.png

composite -compose difference "$1.low.png" "$1.high.png" "$1.png"

rm "$1.low.png"

rm "$1.high.png"