Atmosphère✨ Premium

Drag Feedback Sound

Oscillateur sawtooth Web Audio continu pendant le drag — la position X module la fréquence de 80 Hz à 280 Hz en temps réel, sans latence.

Web AudioDragFriction

Vous aurez accès à la démo interactive avec un compte gratuit.

Cet effet fait partie d'Effect.Labs — 811 effets vanilla, une partie gratuite, une partie premium. Atmosphère comprend 57 effets, dont 10 gratuits. Découvrir la catégorie →

3 exemples d'usage

Hero / Landing — Démo musicale interactive sur une landing d'app audio — Drag Feedback Sound exemple 1

① Hero / Landing — Démo musicale interactive sur une landing d'app audio

QuandSur une landing page d'outil musical en ligne (DAW, synthé, bibliothèque de sons), pour illustrer immédiatement la notion de contrôle du son par geste.
PourquoiLa friction sonore capte l'attention dès l'arrivée et montre sans texte la nature interactive du produit. Le visiteur comprend l'UX en 2 secondes.
RéglagesType d'onde sawtooth (défaut, timbre de friction reconnaissable) ; gain à 0,03 pour une démo légèrement plus audible ; plage 80–280 Hz conservée.
Composant produit — Curseur de fréquence dans un panneau de réglages audio — Drag Feedback Sound exemple 2

② Composant produit — Curseur de fréquence dans un panneau de réglages audio

QuandDans un panel de réglages (égaliseur, filtre, synthé simplifié) pour remplacer un <code>&lt;input type="range"&gt;</code> classique par une interaction plus immersive.
PourquoiL'utilisateur perçoit directement l'effet de son geste — le son change en temps réel. Moins de frictions cognitives qu'un slider numérique : le résultat sonore est la confirmation.
Réglagesd.frequency.value = 150 comme point de départ médian ; étendez la plage à 100 + c / l.width * 400 (100–500 Hz) pour un contrôle plus large.
Micro-interaction de conversion — Sélection d'ambiance sonore à l'onboarding — Drag Feedback Sound exemple 3

③ Micro-interaction de conversion — Sélection d'ambiance sonore à l'onboarding

QuandLors de l'étape de personnalisation de l'expérience (choix d'un thème, son d'alerte, profil sonore) avant d'accéder au produit.
PourquoiImpliquer physiquement l'utilisateur dans le réglage de son expérience renforce l'appropriation et diminue le taux d'abandon sur les étapes d'onboarding multi-étapes.
RéglagesGain à 0,04 (légèrement plus présent) ; limiter la zone à 400 px de large ; afficher un label de fréquence mis à jour en JS (Math.round(d.frequency.value) + ' Hz').

Comment ça marche

Un AudioContext unique est créé à la demande via getSndCtx() au premier mousedown — la création différée satisfait la politique de geste utilisateur des navigateurs modernes. À chaque drag, un OscillatorNode de type sawtooth et un GainNode (gain fixe à 0,02) sont instanciés, connectés en série et démarrés sans enveloppe : oscillateur → gain → destination.

La position X de l'objet dans la zone (c, en px CSS) est normalisée sur la largeur du conteneur et convertie en fréquence instantanément : f = 80 + (c / width) × 200, soit 80 Hz à gauche et 280 Hz à droite. La mise à jour est synchrone dans le handler mousemove — aucun requestAnimationFrame intermédiaire — la hauteur suit la souris sans délai perceptible.

La position de l'objet est contrainte dans les bornes de la zone par Math.max(0, Math.min(width − 60, c)) (la constante 60 correspond à la taille de l'objet en CSS px). Au mouseup, oscillator.stop() coupe le son de manière abrupte — sans fondu sortant. Un oscillateur frais est créé à chaque nouveau drag pour éviter l'InvalidStateError sur un AudioNode déjà arrêté.

Accessibilité

  • Pas de prefers-reduced-motion dans le code — la transition CSS box-shadow .2s sur .snd-drag-obj s'anime sans réduction ; ajoutez @media (prefers-reduced-motion: reduce) { .snd-drag-obj { transition: none } } si votre public est concerné.
  • Aucun attribut ARIA sur la zone ou l'objet draggable — ni role="button", ni aria-grabbed, ni aria-label. L'élément n'est pas annoncé comme interactif aux lecteurs d'écran.
  • Interaction souris uniquement : le code n'écoute que mousedown, mousemove et mouseup — les écrans tactiles et la navigation clavier ne peuvent pas déclencher l'effet.
  • L'AudioContext est instancié au premier mousedown (geste utilisateur valide). La politique de lecture automatique des navigateurs est respectée : aucun son ne se lance à l'affichage de la page.
  • Le contraste de l'emoji 🎵 sur le dégradé violet-rose n'est pas validé dans le code — vérifiez le ratio si vous remplacez le contenu de l'objet par du texte.

Compatibilité navigateur

Nécessite Web Audio API (AudioContext, OscillatorNode) et les événements souris. Pas de support touch natif. Zéro dépendance externe.

Chrome 66+✓ Complet
Firefox 76+✓ Complet
Safari 14.1+✓ Complet (webkit fallback inclus)
Edge 79+✓ Complet
Mobile iOS✓ Pas de touch
Android Chrome✓ Pas de touch

Si <code>AudioContext</code> est absent, le drag visuel fonctionne normalement (la position se met à jour), mais aucun son n'est émis. Aucune erreur JS bloquante — la page reste fonctionnelle.

Le code

Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :

index.html — structure
<div class="demo-preview">
  <div class="snd-drag-area" id="sndDragArea">
    <div class="snd-drag-obj" id="sndDragObj">🎵</div>
  </div>
</div>
🔒 Débloquer le code complet — à partir de 2,99 € le 1er mois

HTML + CSS + JS complet, prêt à coller — avec des centaines d'effets premium.

Personnaliser

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

Option / propriétéDéfautEffet
d.type = "sawtooth" "sawtooth" Type d'onde de l'oscillateur. "sawtooth" = riche en harmoniques, timbre de friction abrasif. "triangle" = doux et flûté. "sine" = ton pur sans harmoniques. "square" = creux et électronique.
d.frequency.value = 100 100 Hz Fréquence de l'oscillateur au moment où le drag commence (avant le premier déplacement). Montez à 200–400 Hz pour une tessiture de départ plus brillante.
80 (dans 80 + c / l.width * 200) 80 Hz Fréquence minimale, atteinte quand l'objet est à l'extrême gauche de la zone. Modifiez cette constante pour ajuster le bas de la plage.
200 (dans 80 + c / l.width * 200) 200 Hz (amplitude) Étendue de la plage de fréquences : max = 80 + 200 = 280 Hz. Passez à 420 pour couvrir 80–500 Hz, ou à 920 pour un octave complet (80–1000 Hz).
o.gain.value = .02 0,02 Volume de l'oscillateur (0 à 1). 0,02 est très discret — passez à 0,05 pour un son plus présent, 0 pour couper le son tout en conservant le drag visuel.
.snd-drag-obj { width: 60px; height: 60px } 60 × 60 px Taille de l'objet draggable en CSS. La constante 60 dans la formule JS (width − 60) doit être mise à jour si vous changez la taille.
.snd-drag-obj { background: linear-gradient(135deg, #6366f1, #ec4899) } Gradient violet-rose Couleur de fond de l'objet draggable. Remplacez par votre palette brand ou un aplat (background: #3b82f6).

FAQ

Non. Le code écoute uniquement mousedown, mousemove et mouseup — pas d'événements touch*. Pour le support tactile, ajoutez touchstart, touchmove et touchend en adaptant les coordonnées via event.touches[0].clientX et event.touches[0].clientY.
L'onde en dents de scie contient tous les partiels harmoniques (pairs et impairs) avec une amplitude décroissante — c'est la forme d'onde la plus riche et la plus abrasive de Web Audio API, idéale pour imiter un frottement mécanique. "triangle" donne un timbre doux et flûté, "sine" un ton pur sans harmoniques. Vous pouvez changer d.type après le createOscillator(), avant le start().
L'AudioContext peut passer en état suspended après une longue inactivité ou si la politique du navigateur l'exige. Ici, le contexte est créé dans le mousedown (geste utilisateur valide), ce qui évite la suspension initiale. En cas de silence inattendu, appelez getSndCtx().resume() pour réactiver le contexte.