{"id":62,"date":"2016-12-08T10:36:29","date_gmt":"2016-12-08T10:36:29","guid":{"rendered":"http:\/\/habett.fr\/blog\/?p=62"},"modified":"2016-12-08T10:36:29","modified_gmt":"2016-12-08T10:36:29","slug":"waveform","status":"publish","type":"post","link":"https:\/\/habett.fr\/blog\/2016\/12\/waveform\/","title":{"rendered":"Waveform"},"content":{"rendered":"<p>Il n&rsquo;\u00e9chappera \u00e0 personne que je fais par ailleurs de la musique et que je la publie sur un de mes sites (<a href=\"http:\/\/habett.net\">http:\/\/habett.net<\/a>). Pour avoir par ailleurs mis de la musique sur soundcloud j&rsquo;observe que les formes d&rsquo;ondes sont bien utiles pour comprendre et appr\u00e9cier la structure du morceau. Reste que les waveforms de soundcloud sont extr\u00eamement peu parlantes. J&rsquo;ignore leur algorithme mais il est vraiment l\u00e9nifiant et donne un r\u00e9sultat tellement peu expressif que je me suis tr\u00e8s rapidement dit que je pouvais faire beaucoup mieux.<\/p>\n<p>L&rsquo;outil pour y proc\u00e9d\u00e9 vas \u00eatre un script bash avec quelques d\u00e9pendances : sox, gnuplot et imagemagick. Le param\u00e8tre est le nom du fichier .wav \u00e0 traiter sans son extension. Vous pouvez observer que je fais en fait deux waveforms que je combine \u00e0 la fin dans \u00a0un composite, pour obtenir un repr\u00e9sentation diff\u00e9rentielles des fr\u00e9quences utilis\u00e9es par la musique en question, waveform plus sombre pour les basses et claire pour les aigus dominants.<\/p>\n<blockquote>\n<pre>#!\/bin\/sh\r\n\r\nWAV=${1%.wav}\r\nsox \"$WAV\" \/tmp\/test.wav lowpass 500\r\n\r\nsox \/tmp\/test.wav --rate 1k \/tmp\/test.dat\r\n\r\nrm \/tmp\/test.wav\r\n\r\ngrep -v '^;' \/tmp\/test.dat &gt;\/tmp\/test.clean\r\n\r\nperl -pe 's\/.*\/0 1 1\\n0.0001 -1 -1\/ if $. == 1' \/tmp\/test.clean &gt; \/tmp\/test.norm\r\n\r\nrm \/tmp\/test.dat\r\n\r\nrm \/tmp\/test.clean\r\n\r\nCMD=\"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\"\r\n\r\n echo $CMD | gnuplot\r\n\r\nrm \/tmp\/test.norm\r\n\r\nconvert \/tmp\/test.png -scale 1600x400 \"$1.low.png\"\r\n\r\nrm \/tmp\/test.png\r\n\r\nsox \"$WAV\" \/tmp\/test.wav highpass 300\r\n\r\nsox \/tmp\/test.wav --rate 1k \/tmp\/test.dat\r\n\r\nrm \/tmp\/test.wav\r\n\r\ngrep -v '^;' \/tmp\/test.dat &gt;\/tmp\/test.clean\r\n\r\nperl -pe 's\/.*\/0 1 1\\n0.0001 -1 -1\/ if $. == 1' \/tmp\/test.clean &gt; \/tmp\/test.norm\r\n\r\nrm \/tmp\/test.dat\r\n\r\nrm \/tmp\/test.clean\r\n\r\necho $CMD | gnuplot\r\n\r\nrm \/tmp\/test.norm\r\n\r\nconvert \/tmp\/test.png -negate -scale 1600x400 \"$1.high.png\"\r\n\r\nrm \/tmp\/test.png\r\n\r\ncomposite -compose difference \"$1.low.png\" \"$1.high.png\" \"$1.png\"\r\n\r\nrm \"$1.low.png\"\r\n\r\nrm \"$1.high.png\"<\/pre>\n<p>&nbsp;<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Il n&rsquo;\u00e9chappera \u00e0 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&rsquo;observe que les formes d&rsquo;ondes sont bien utiles pour comprendre et appr\u00e9cier la structure du morceau. Reste que les waveforms de soundcloud &hellip; <a href=\"https:\/\/habett.fr\/blog\/2016\/12\/waveform\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Waveform<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[22,21,24,23],"class_list":["post-62","post","type-post","status-publish","format-standard","hentry","category-music","tag-music","tag-musique","tag-visualization","tag-waveform"],"_links":{"self":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/62","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/comments?post=62"}],"version-history":[{"count":2,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/62\/revisions"}],"predecessor-version":[{"id":64,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/posts\/62\/revisions\/64"}],"wp:attachment":[{"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/media?parent=62"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/categories?post=62"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/habett.fr\/blog\/wp-json\/wp\/v2\/tags?post=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}