Hover✨ Premium

Sound Visualizer

Visualiseur audio en Web Audio : 20 barres qui réagissent au vrai spectre sonore — son de démo synthétisé, micro optionnel, source externe prise en charge.

JSAudioVisual

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. Hover comprend 48 effets, dont 5 gratuits. Découvrir la catégorie →

3 exemples d'usage

Barres géantes en fond — page d'accueil d'un festival ou d'un podcast — Sound Visualizer exemple 1

① Barres géantes en fond — page d'accueil d'un festival ou d'un podcast

QuandLe haut de page d'un festival de musique ou d'un podcast : les barres couvrent toute la largeur en fond derrière le titre et le bouton « Écouter l'extrait ». Elles s'animent quand l'utilisateur clique et restent réactives pendant toute la lecture.
PourquoiUn fond sonore vivant transforme un header statique en expérience sensorielle ; il signale instantanément que la page est liée à la musique et donne envie d'appuyer sur le bouton d'écoute.
RéglagesRacine en position: absolute; inset: 0, fond transparent (--viz-bg: transparent), barres sans plafond de largeur (max-width: none via CSS de scène) pour couvrir toute la section. Hauteur des barres : 192 px. Couleur basse #2563eb, couleur haute #a855f7. Contrôles masqués par CSS de scène.
Indicateur « en lecture » — ligne de titre dans une playlist — Sound Visualizer exemple 2

② Indicateur « en lecture » — ligne de titre dans une playlist

QuandDans un lecteur audio en ligne, la liste de titres : le morceau en cours affiche un petit visualiseur de spectre (96 × 22 px) à droite de son nom, les autres lignes n'en ont pas. Les barres s'animent pendant la lecture et retombent à la pause. En production, on branche data-fx0378-source sur l'élément <audio> du lecteur.
PourquoiUn indicateur spectral anime la ligne « en cours de lecture » sans ajouter d'icône statique ; il est immédiatement lisible et occupe une surface minimale dans la liste.
RéglagesRacine de 96 × 22 px, fond transparent, hauteur des barres 22 px, espace entre barres 2 px, débordement masqué (overflow: hidden). Contrôles et statut masqués. Couleur basse #6366f1, couleur haute #a78bfa.
Jauge de niveau — écran de vérification du micro avant une visio — Sound Visualizer exemple 3

③ Jauge de niveau — écran de vérification du micro avant une visio

QuandÉcran intermédiaire « Tester son matériel » avant de rejoindre une visioconférence : sélecteur de micro, jauge de spectre et message « Vous êtes bien audible » qui s'affiche dès que le signal est détecté. L'utilisateur clique « Vérifier le micro » pour activer l'entrée audio réelle. Dans les captures de cet exemple, la démo synthétisée alimente la jauge à la place du vrai micro — ce comportement est privé et n'est pas présenté comme une fonctionnalité.
PourquoiUn vumètre spectral en temps réel donne une rétroaction immédiate sur le niveau et la présence du signal micro, bien plus fiable qu'un simple indicateur vert/rouge.
RéglagesRacine pleine largeur dans le panneau central. Bouton « Lancer la démo » masqué par CSS (seul « Vérifier le micro » est visible). Hauteur des barres : 52 px. Couleur basse #22c55e, couleur haute #86efac. Fond #0d1a12 avec bordure verte légère.

Comment ça marche

La racine .fx-0378-root contient trois zones : .viz-bars (20 barres .viz-bar créées par le script, décoratives), .viz-controls (deux vrais <button>) et .viz-status (annonce d'état pour les lecteurs d'écran). Le CSS donne aux barres un dégradé indigo-violet (linear-gradient(to top, #6366f1, #d946ef)) et une hauteur au repos de 4 px.

Le script initialise un AudioContext par racine, avec un AnalyserNode (FFT de 256 points, 128 bins de fréquences, lissage à 0,78). À chaque image, getByteFrequencyData remplit un tableau de 128 octets. Les 20 barres sont associées à des plages de fréquences selon une échelle logarithmique (20 Hz–Nyquist) : les graves occupent les premières barres, les aigus les dernières — comme un vrai égaliseur de spectre. Hauteur calculée : valeur / 255 × 126 px, minimum 4 px.

Le son de démonstration est entièrement synthétisé : un ordonnanceur setTimeout planifie des événements Web Audio 280 ms à l'avance en boucle de 8 temps à 120 BPM (un temps = 0,25 s). La boucle combine : une grosse caisse (oscillateur sinus de 90 à 28 Hz, enveloppe d'amplitude), un charleston (bruit blanc filtré passe-haut à 8 800 Hz), un clap (bruit blanc filtré passe-bande à 1 500 Hz) et une mélodie en pentatonique G4–G5 (oscil­lateurs en dents de scie à 659, 523, 784, 587 Hz, filtrés passe-bas à 3 200 Hz). La richesse harmonique des dents de scie anime les barres du milieu, les percussions les barres graves et aiguës.

Pour brancher votre propre lecteur, ajoutez data-fx0378-source="#mon-audio" sur la racine : le script écoute play sur cet élément <audio> ou <video>, crée un MediaElementAudioSourceNode (une seule fois par élément), le connecte à l'analyseur et à la sortie, puis lance le dessin des barres. Attention CORS : un fichier hébergé sur un autre domaine doit envoyer les en-têtes Access-Control-Allow-Origin adéquats, sinon createMediaElementSource échoue.

L'AudioContext se suspend dès que la racine sort de l'écran (IntersectionObserver) ou que l'onglet est masqué (visibilitychange), et reprend à leur retour. Arrêt propre : les pistes du micro sont stoppées (stream.getTracks().forEach(t => t.stop())), les nœuds déconnectés, le contexte suspendu.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, la boucle requestAnimationFrame est remplacée par des mises à jour toutes les 300 ms (3–4 Hz) sans transition CSS. Le visualiseur reste informatif — les barres reflètent le spectre réel du son — sans mouvement continu. Le son et le message de statut fonctionnent normalement.
  • Boutons accessibles : les deux boutons portent aria-pressed mis à jour à chaque changement d'état ("false" / "true"). Ils sont atteignables par Tab, activables par Entrée ou Espace, et dotés d'un contour :focus-visible. Leur libellé change entre « Lancer la démo » et « Arrêter la démo ».
  • Barres décoratives : le conteneur .viz-bars porte aria-hidden="true" ; les barres ne transportent aucune information sonore, elles sont un reflet visuel. L'état sonore est annoncé dans .viz-status (aria-live="polite").
  • Micro et https : getUserMedia est bloqué sur les pages non sécurisées (http en production). Un message d'erreur précis est affiché selon le type d'erreur : refus, micro absent, page non sécurisée.
  • Aucune interaction gestuelle imposée : aucun son ne démarre sans clic explicite de l'utilisateur (politique d'autoplay des navigateurs). Le micro ne s'active qu'après confirmation du navigateur.

Compatibilité navigateur

Web Audio API (AudioContext, AnalyserNode, createMediaStreamSource, createMediaElementSource, IntersectionObserver). Aucune dépendance externe. Mesuré dans Chromium 151 et Firefox 153 : son de démonstration, analyse spectrale, deux copies indépendantes dans la même page, 0 erreur JS. WebKit supporte Web Audio depuis Safari 14.1 : non vérifié en vrai Safari.

Chrome 55+✓ Complet (mesuré)
Firefox 53+✓ Complet (mesuré)
Safari 14.1+✓ Web Audio supporté, non vérifié en vrai Safari
Edge 79+✓ Complet (moteur Chromium)
Mobile iOS 14.5+✓ AudioContext supporté, non vérifié sur appareil réel
Android Chrome 55+✓ Complet (moteur Chromium)

Sans JavaScript ou sans Web Audio (navigateur très ancien), les 20 barres à 4 px sont visibles, les boutons sont affichés mais inactifs. Aucune erreur levée.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0378-root">
  <div class="viz-bars" aria-hidden="true"></div>
  <div class="viz-controls">
    <button class="viz-btn viz-btn--demo" type="button" aria-pressed="false">
      <span class="viz-btn-icon" aria-hidden="true">▶</span>
      <span class="viz-btn-label">Lancer la démo</span>
    </button>
    <button class="viz-btn viz-btn--mic" type="button" aria-pressed="false">
      <span class="viz-btn-icon" aria-hidden="true">🎙</span>
      <span class="viz-btn-label">Microphone</span>
    </button>
  </div>
  <div class="viz-status" aria-live="polite" aria-atomic="true"></div>
</div>

Paiement unique, sans abonnement — le code est à toi pour toujours

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Source audio (HTML — attribut data-fx0378-source sur .fx-0378-root) Aucune : seul le son de démo synthétisé est disponible Passez le sélecteur CSS de votre élément <audio> ou <video> (ex. data-fx0378-source="#mon-player"). Le visualiseur démarre automatiquement à la lecture et s'arrête à la pause. CORS : si le fichier audio vient d'un autre domaine, il doit renvoyer Access-Control-Allow-Origin: *.
Couleur basse et couleur haute des barres (CSS — --viz-low et --viz-high sur .fx-0378-root) #6366f1 (indigo) → #d946ef (violet-rose) Redéfinissez les deux variables sur la racine : style="--viz-low:#f97316;--viz-high:#fbbf24".
Nombre de barres (JS — constante NUM_BARS) 20 Augmentez jusqu'à 48 pour plus de détail fréquentiel. Diminuez jusqu'à 8 pour un rendu épuré. La largeur des barres (flex: 1; max-width: 14px) s'adapte automatiquement.
Résolution FFT (JS — analyser.fftSize) 256 (128 bins) Passez à 512 ou 1024 pour affiner la résolution fréquentielle — surtout utile si vous afficher plus de 32 barres. Doit être une puissance de 2.
Tempo de la démo (JS — constante BPM) 120 Ralentissez à 90 pour un groove plus posé, montez à 140 pour un effet plus rapide. Le motif de 8 temps s'adapte automatiquement.
Hauteur maximale des barres (JS — le 126 dans le calcul de hauteur) 126 px Ajustez selon la hauteur du conteneur parent. Ne doit pas dépasser la hauteur de .viz-bars (height: 130px).

FAQ

Ajoutez data-fx0378-source="#id-du-lecteur" sur la balise .fx-0378-root. Le visualiseur se connecte automatiquement à la lecture et se déconnecte à la pause. Important CORS : si votre fichier audio est hébergé sur un autre domaine (CDN, service tiers), ce domaine doit renvoyer l'en-tête Access-Control-Allow-Origin: * ou votre domaine spécifiquement — sinon createMediaElementSource échoue et un message d'erreur s'affiche.
Trois causes fréquentes : (1) Page en http : getUserMedia est bloqué sur les pages non sécurisées — déployez en https. (2) Permission refusée : l'utilisateur a refusé l'accès au micro dans la fenêtre du navigateur — il peut réautoriser depuis les paramètres du site. (3) Aucun micro détecté : vérifiez que le micro est branché et reconnu par le système.
Le son de démo est un ordonnanceur Web Audio embarqué dans le script. Repérez la section « Synthèse du son de démo » : PAT_KICK, PAT_HAT, PAT_CLAP et PAT_MEL définissent le motif de 8 temps ; SCALE les fréquences de la mélodie ; BPM le tempo. Les fonctions schedKick, schedHat, schedClap et schedNote créent les nœuds Audio à chaque step.