Changeset c0e463b in Klonkt for src/assets/js/mod/tape.js


Ignore:
Timestamp:
08/22/2026 11:05:19 AM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
5e72413
Parents:
4fbe2c1
Message:

Speler-UI in bandmodus: spoelknoppen, eerlijke teller, lijst zonder keuze (shaer-tmyn)

Speelt er een bandje, dan hoort de speler onderin zich als een cassettedeck te
gedragen en niet als een playlist-speler. Drie van de vier stappen uit de bead;
de vierde (seek over de hele tijdlijn) staat er los van, want die raakt
loadTrack en de keten.

  • De tracklijst blijft staan maar is geen keuzelijst: renderQueue hangt in bandmodus geen klik meer op de items, en een CSS-klasse haalt de belofte weg dat het kan. Op een cassette spring je niet naar nummer zeven.
  • Vorige/volgende worden terugspoelen/vooruitspoelen: ander teken, ander woord, en vasthouden spoelt door. Een korte klik spoelt vijf seconden, voor toetsenbord en schermlezer.
  • De spoellus is VERHUISD naar de speler. Hij stond in mod/tape.js, en met spoelknoppen op twee plekken zouden twee kopieen van dezelfde versnelling uit elkaar lopen zodra iemand aan een getal draait. De cassette in de post bedient nu dezelfde lus en tekent alleen nog het jasje.

En de teller is eerlijk geworden. Die kwam uit chain[last].end, dus uit de
lengte van wat toevallig gebufferd was: 2:05 met een nummer geladen, 4:07 met
drie, terwijl de band 6:13 duurt. Erger nog, sprong je naar nummer drie dan
begon de keten daar opnieuw op nul en stond de teller weer vooraan. Nu telt hij
bandOffset(nummer) + positie in dat nummer, uit de trackduren -- die daarvoor
in de wachtrij-JSON moesten. Ontbreekt er een duur, dan valt hij terug: een som
met gaten is een verzonnen getal.

Nagemeten op dev: totaal 6:13 meteen bij de eerste seconde (klopt met de
PT373S op het AP-object), vier knoppen op Terug-/Vooruitspoelen, drie items in
de lijst met pointer-events none en het lopende nummer gemarkeerd, en spoelen
via de spelerknop loopt door de band heen.

audio-player v38, MOD_V 55, style.css v108.

Co-Authored-By: Claude Opus 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/tape.js

    r4fbe2c1 rc0e463b  
    1414 * die tijdlijn. Vandaar seekBy() en niet next()/prev() -- springen per nummer
    1515 * is een playlistgebaar, en dan is dit een lijst met een cassetteplaatje.
     16 *
     17 * DE SPOELLUS STAAT IN DE SPELER, niet hier: sinds de speler onderin dezelfde
     18 * spoelknoppen heeft zou dezelfde versnelling op twee plekken staan. Deze
     19 * module bedient hem en tekent het jasje.
    1620 *
    1721 * WAAROM ER GEPOLLD WORDT. audio-player.js zendt geen gebeurtenissen uit -- het
     
    5660  tape.classList.toggle('is-playing', draait);
    5761  tape.classList.toggle('is-loaded', i >= 0);
     62  // Spoelt de SPELER (bijvoorbeeld via zijn eigen knoppen onderin), dan hoort
     63  // deze cassette dat ook te laten zien.
     64  const windt = i >= 0 && !!p && p.isWinding && p.isWinding();
     65  if (!windt) tape.classList.remove('is-winding', 'is-winding-back');
     66  else tape.classList.add('is-winding');
    5867
    5968  const knop = tape.querySelector('[data-tape-play]');
     
    91100 * schermlezer, want vasthouden is met een spatiebalk geen gebaar.
    92101 */
    93 const START_SNELHEID = 4;    // maal de normale snelheid bij het indrukken
    94 const MAX_SNELHEID = 16;
    95 const VERSNELLING = 1.35;    // per stap
    96 const STAP_MS = 120;
    97102const TIK_STAP_S = 5;        // een losse klik
    98103
    99 let winder = null;
    100 
    101104function stopWinden(tape) {
    102   if (winder) { clearInterval(winder.timer); winder = null; }
     105  const p = speler();
     106  if (p && p.stopWind) p.stopWind();
    103107  if (tape) tape.classList.remove('is-winding', 'is-winding-back');
    104108}
     
    106110function startWinden(tape, richting) {
    107111  const p = speler();
    108   if (!p || huidigeIndex(tape) < 0) return;
    109   stopWinden(tape);
    110   let snelheid = START_SNELHEID;
    111   let vorigePositie = null;
    112   let stil = 0;
     112  if (!p || !p.startWind || huidigeIndex(tape) < 0) return;
     113  // DE LUS STAAT IN DE SPELER. Hij stond hier, en toen kreeg de speler zelf ook
     114  // spoelknoppen -- twee kopieen van dezelfde versnelling die uit elkaar lopen
     115  // zodra iemand aan een getal draait. Deze module zet alleen nog het jasje:
     116  // welke spoelen draaien en hoe hard.
     117  p.startWind(richting);
    113118  tape.classList.add('is-winding');
    114119  if (richting < 0) tape.classList.add('is-winding-back');
    115   const timer = setInterval(() => {
    116     snelheid = Math.min(MAX_SNELHEID, snelheid * VERSNELLING);
    117     p.seekBy(richting * snelheid * (STAP_MS / 1000));
    118     tekenBand(tape);
    119     // AAN HET EIND VAN DE BAND STOPPEN MET SPOELEN. De speler klemt de positie
    120     // af, dus daar gebeurt niets meer -- maar de spoelen bleven wel doordraaien
    121     // en de knop bleef oplichten, alsof er nog band was. Beweegt de teller twee
    122     // rondes niet, dan zijn we bij de kop of de staart.
    123     const nu = p.tapeTijden ? p.tapeTijden().cur : null;
    124     if (nu !== null && vorigePositie !== null && Math.abs(nu - vorigePositie) < 0.05) {
    125       if (++stil >= 2) { stopWinden(tape); return; }
    126     } else stil = 0;
    127     vorigePositie = nu;
    128   }, STAP_MS);
    129   winder = { timer, tape };
    130120}
    131121
Note: See TracChangeset for help on using the changeset viewer.