Skip to content

Lecteur : remplissage fluide de la waveform (60 barres, balayage continu) - #475

Merged
Oasis35 merged 2 commits into
env/stagingfrom
claude/project-thread-tzbx28
Nov 2, 2026
Merged

Oasis35 merged 2 commits into
env/stagingfrom
claude/project-thread-tzbx28

Conversation

@Oasis35

@Oasis35 Oasis35 commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner

Requested by Clément · project thread

Closes #473.

Ce qui change

  • 60 barres au lieu de 32 (WAVEFORM_BARS) : une barre = 1/6 s sur 10 s, chaque palier tombe entre deux barres. Écart de 2 px, coins un peu plus petits pour des barres d'environ 3 px.
  • Balayage continu : trois couches de barres identiques (gris, cyan pâle, cyan vif). Les deux du dessus sont découvertes de gauche à droite par deux translations opposées, arrondies au pixel (la couche glisse, ses barres restent en place, sans liseré gris) : une barre peut être à moitié jouée, et seul transform change pendant la lecture. Le cyan pâle s'étend en 300 ms quand un palier se débloque.
  • Position lissée (gameplay/domain/playhead.ts, SmoothPlayhead) : entre deux mises à jour de currentTime, la position avance à l'horloge, avec 0,3 s d'avance au plus (lecture bloquée), rien avant le premier vrai son (faux playing de Safari, piège 46), jamais au-delà du palier, ne recule que sur une relecture. Purement visuel : HtmlAudioPort et l'arrêt du palier ne sont pas touchés (pièges 44 et 46).
  • Mouvement réduit : ni lissage ni transition, la couche vive avance au dixième, comme le chrono.
  • Moins de travail par image : la couche jouée est menée par une boucle d'image hors du gabarit (plus de tableau de barres recalculé à chaque image), le chrono pour lecteur d'écran et aria-valuenow ne changent qu'au dixième. Le bouton qui danse est sur son propre calque (will-change: transform dans app-membrane).
  • Le calcul de la forme reste dans le navigateur (le Lecteur : forme de l'extrait calculée la nuit par l'API et envoyée avec le morceau #474 viendra à part). Le passer dans un Web Worker n'apporte rien ici : decodeAudioData décode déjà hors du fil principal, et les barres et l'enveloppe se calculent en quelques millisecondes.

Tests

  • playhead.spec.ts (nouveau) : avance entre deux positions, rien avant le premier son, plafond d'avance, palier, relecture.
  • round-player.component.spec.ts : 60 barres par couche, parts découvertes (débloquée, jouée, chargement), translations au pixel près, suivi de la position à chaque image, arrêt de la boucle (fin de lecture, destruction), mouvement réduit, chrono au dixième.
  • Vitest gameplay/** : 301/301 en local, npm run build et npm run lint:arch OK. E2E laissés à la CI (pas de .NET dans la session).
  • Capture rendue en local à 375 px : rendu conforme.
  • Relecture : relecteur-pr (rien de bloquant) et gardien-da (pixel près et mouvement réduit traités dans le 2e commit).
  • Pas profilé sur un vrai téléphone : à regarder sur le staging, surtout à 320 px (barres de 2,3 px, gris à 14 %) et la relecture ↺ sur iPhone.

Doc

src/front/CLAUDE.md (lecteur, membrane, 60 barres), docs/conformite/conditions-api-deezer.md (60 barres).

60 barres au lieu de 32 (chaque palier tombe entre deux barres), balayage
continu en trois couches découvertes par transform, position lissée entre
deux mises à jour de currentTime (SmoothPlayhead), couche jouée menée par
une boucle d'image hors du gabarit, bouton sur son propre calque.
@Oasis35 Oasis35 self-assigned this Nov 2, 2026
@Oasis35
Oasis35 marked this pull request as ready for review November 2, 2026 09:40
…sts de la boucle d'image

Retours de relecture : les couches cyan glissent d'un nombre entier de
pixels (pas de liseré gris sur des barres de 2 à 3 px), la couche vive
avance au dixième en mouvement réduit, tests de l'arrêt de la boucle
d'image et du mouvement réduit.
@sonarqubecloud

sonarqubecloud Bot commented Nov 2, 2026

Copy link
Copy Markdown

@Oasis35
Oasis35 merged commit b58aa4a into env/staging Nov 2, 2026
13 checks passed
@Oasis35
Oasis35 deleted the claude/project-thread-tzbx28 branch November 2, 2026 10:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant