{"id":11143,"date":"2025-12-11T10:04:55","date_gmt":"2025-12-11T09:04:55","guid":{"rendered":"https:\/\/spgoo.org\/?page_id=11143"},"modified":"2025-12-12T15:29:19","modified_gmt":"2025-12-12T14:29:19","slug":"librairie-audiomotion-analyzer","status":"publish","type":"page","link":"https:\/\/spgoo.org\/?page_id=11143","title":{"rendered":"Librairie AudioMotion-Analyzer"},"content":{"rendered":"\n<p>Dans le cadre des projets PASSY-DPFV et FRAP\u00e9OR nous avons d\u00fb trouver une solution  pour afficher de fa\u00e7on dynamique les enregistrements sonores. Pour ce faire, apr\u00e8s exploration de l&#8217;existant en passant par p5.js, nous nous sommes arr\u00eat\u00e9s sur cette librairie qui a priori correspond \u00e0 nos besoins. <\/p>\n\n\n\n<p>Sources : <a href=\"https:\/\/github.com\/hvianna\/audioMotion-analyzer\/releases\">https:\/\/github.com\/hvianna\/audioMotion-analyzer\/releases<\/a><\/p>\n\n\n\n<p>Fen\u00eatre de d\u00e9monstration de cette librairie : <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1211\" height=\"894\" src=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-11-09-19-49.png\" alt=\"\" class=\"wp-image-11212\" srcset=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-11-09-19-49.png 1211w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-11-09-19-49-300x221.png 300w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-11-09-19-49-1024x756.png 1024w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-11-09-19-49-768x567.png 768w\" sizes=\"auto, (max-width: 1211px) 100vw, 1211px\" \/><\/figure>\n\n\n\n<p>Mise en oeuvre et retour d&#8217;exp\u00e9rience :<\/p>\n\n\n\n<p>Mise en oeuvre dans un contexte plus simple : <a href=\"\/?page_id=11219\">voir<\/a><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"971\" src=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-44-27-1024x971.png\" alt=\"\" class=\"wp-image-11238\" style=\"aspect-ratio:1.054613935969868;width:548px;height:auto\" srcset=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-44-27-1024x971.png 1024w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-44-27-300x285.png 300w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-44-27-768x729.png 768w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-44-27.png 1089w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Insertion de cette librairie dans nos contextes WordPress par l&#8217;import de module. Page de d\u00e9monstration qui illustre l&#8217;int\u00e9gration de ce module dans nos d\u00e9veloppements.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> &lt;script&gt;\n        \/\/ d\u00e9finition de l'espace de nom par defaut attache au module \n        const soundYS={};\n    &lt;\/script&gt;\n    &lt;script type=\"module\"&gt;\n      \/\/ on accroche \u00e0 cet espace de nom les traitements de sonores definis dans le module\n      import { AudioMotionAnalyzer } from \".\/personnalisation\/audioMotion-analyzer-4.5.2\/src\/audioMotion-analyzer.js\";\n      soundYS.AudioMotionAnalyzer = AudioMotionAnalyzer;\n    &lt;\/script&gt; <\/code><\/pre>\n\n\n\n<p>Instanciation de l&#8217;objet <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   document.addEventListener(\"DOMContentLoaded\", function(event) {\n        \n        \/\/ Initialisation de l'analyseur une fois la librairie et le module charg\u00e9s \n        audioMotion = new soundYS.AudioMotionAnalyzer(\n            document.getElementById('containerYS'),\n            {\n                mode: 10,\n                gradient: 'prism',\n                showScaleX: true,\n                showScaleY: true,\n                showPeaks: true,\n                smoothing: 0.5,\n                height: 300,\n                fftSize: 8192,\n                minDecibels: -85,\n                maxDecibels: -25,\n                showBgColor: true,\n                bgAlpha: 0.7,\n                overlay: true,\n                lineWidth: 2,\n                fillAlpha: 0.6,\n                barSpace: 0.1,\n                reflexRatio: 0,\n                reflexAlpha: 0.15,\n                reflexBright: 1,\n                reflexFit: true,\n                minFreq: 20,\n                maxFreq: 22000,\n                radius: 0.3,\n                spinSpeed: 0,\n                alphaBars: false,\n                lumiBars: false,\n                trueLeds: false,\n                mirror: 0,\n                splitGradient: false,\n                roundBars: false,\n                channelLayout: 'single',\n                frequencyScale: 'log',\n                noteLabels: false,\n                ansiBands: false,\n                weightingFilter: '',\n            }\n        );\n        });<\/code><\/pre>\n\n\n\n<p>Chargement du fichier audio et association avec l&#8217;objet <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        \/\/ Gestion du fichier audio\n        document.getElementById('fileInput').addEventListener('change', function(e) {\n            const file = e.target.files&#91;0];\n            if (file) {\n                if (audioElement) {\n                    audioElement.pause();\n                    audioElement = null;\n                }               \n                audioElement = new Audio();\n                audioElement.src = URL.createObjectURL(file);     \n                if (!sourceNode) {\n                    sourceNode = audioMotion.audioCtx.createMediaElementSource(audioElement);\n                    sourceNode.connect(audioMotion.<strong>_analyzer&#91;0]<\/strong>);\n                    audioMotion.<strong>_analyzer&#91;0]<\/strong>.connect(audioMotion.audioCtx.destination);\n                }\n                \/\/ on active les boutons de controle de l'interface\n                document.getElementById('fileName').textContent = `Fichier: ${file.name}`;\n                document.getElementById('playBtn').disabled = false;\n                document.getElementById('pauseBtn').disabled = false;\n                document.getElementById('stopBtn').disabled = false;\n            }\n        });<\/code><\/pre>\n\n\n\n<p>Pour \u00e9couter l&#8217;enregistrement, il faut s&#8217;appuyer sur la variable audioElement de la fa\u00e7on suivante : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  document.getElementById('playBtn').addEventListener('click', () =&gt; audioElement &amp;&amp; audioElement.play());<\/code><\/pre>\n\n\n\n<p>Autre exemple : examinons l&#8217;exemple de d\u00e9monstration qui lui a plusieurs zones graphiques dans lesquelles des repr\u00e9sentations compl\u00e9mentaires s&#8217;affichent : container1, container2 et container3<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"303\" src=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-54-01-1024x303.png\" alt=\"\" class=\"wp-image-11243\" srcset=\"https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-54-01-1024x303.png 1024w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-54-01-300x89.png 300w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-54-01-768x228.png 768w, https:\/\/spgoo.org\/wp-content\/uploads\/2025\/12\/Capture-du-2025-12-12-11-54-01.png 1215w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Comment se fait  le lien entre le fichier sonore que l&#8217;on charge et les trois graphiques \u00e0 afficher ? <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>try {\n   for ( let i = 0; i &lt; 3; i++ ) {\n\tconst isFirst = ( i == 0 );\n\taudioMotion&#91; i ] = new AudioMotionAnalyzer(document.getElementById( `container${i}` ), {\n\t   source: isFirst ? document.getElementById('audio') : audioMotion&#91;0].connectedSources&#91;0],\n  \t   connectSpeakers: isFirst,height: isFirst ? 340 : 160,\n\t   onCanvasResize: ( reason, instance ) =&gt; {\n   \t      const instNo = instance.canvas.parentElement.id.slice(-1);\n                if ( reason != 'create' )updateUI();\n\t  }\n\t});\n   }\n}\ncatch( err ) {\n  document.getElementById('container0').innerHTML = `&lt;p&gt;audioMotion-analyzer failed with error: ${ err.code ? '&lt;strong&gt;' + err.code + '&lt;\/strong&gt;' : '' } &lt;em&gt;${ err.code ? err.message : err }&lt;\/em&gt;&lt;\/p&gt;`;\n}<\/code><\/pre>\n\n\n\n<p>Cette partie peut s&#8217;interpr\u00e9ter de la mani\u00e8re suivante c&#8217;est le premier objet AudioMotionAnalyzer qui est attach\u00e9 \u00e0 la source audio, les autres se rattachent au premier via la propri\u00e9t\u00e9 connectedSource[0]<\/p>\n\n\n\n<p>R\u00e9f sur les API audio : <a href=\"https:\/\/webaudio.github.io\/web-audio-api\/\">https:\/\/webaudio.github.io\/web-audio-api\/<\/a> <\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans le cadre des projets PASSY-DPFV et FRAP\u00e9OR nous avons d\u00fb trouver une solution pour afficher de fa\u00e7on dynamique les enregistrements sonores. Pour ce faire, apr\u00e8s exploration de l&#8217;existant en passant par p5.js, nous nous sommes arr\u00eat\u00e9s sur cette librairie qui a priori correspond \u00e0 nos besoins. Sources : https:\/\/github.com\/hvianna\/audioMotion-analyzer\/releases Fen\u00eatre de d\u00e9monstration de cette [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-11143","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/11143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11143"}],"version-history":[{"count":29,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/11143\/revisions"}],"predecessor-version":[{"id":11260,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/11143\/revisions\/11260"}],"wp:attachment":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}