From 533cd1052e341957bde1215ffb969ff3f31c10b1 Mon Sep 17 00:00:00 2001 From: el-yazide mohamed Date: Sat, 7 Jun 2025 07:00:55 +0200 Subject: [PATCH] reverse --- node-server/assets/script.js | 72 +++++++++++++++++++++++++++++------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/node-server/assets/script.js b/node-server/assets/script.js index 70cb811..3e2de2a 100644 --- a/node-server/assets/script.js +++ b/node-server/assets/script.js @@ -11,6 +11,8 @@ const loopBtn = document.getElementById('loop'); // 2. Variables utiles let isPlaying = false; let isLooping = false; +let idleTimeout = null; +let reverseInterval = null; // 3. Variables pour calculer la vitesse de rotation let lastPosition = null; @@ -24,24 +26,37 @@ socket.on('position', (position) => { if (lastPosition !== null && lastTime !== null) { const deltaPos = position - lastPosition; - const deltaTime = (now - lastTime) / 1000; // en secondes + const deltaTime = (now - lastTime) / 1000; - const speed = deltaPos / deltaTime; // ticks par seconde + const speed = deltaPos / deltaTime; console.log('instant speed:', speed); - // Seuil minimal pour stopper la lecture si la balle ne tourne plus + clearTimeout(idleTimeout); + if (Math.abs(speed) < 2) { - controlPlayback(0); // stop + stopPlayback(); } else { - // Mappe la vitesse vers une valeur de lecture entre 0.5 et 2 - let playbackSpeed = 1 + speed * 0.01; // facteur à ajuster selon ton encoder - playbackSpeed = Math.max(0.5, Math.min(2, playbackSpeed)); - controlPlayback(playbackSpeed); + const isReverse = speed < 0; + + // Simuler reverse + if (isReverse) { + simulateReverse(Math.abs(speed)); + } else { + stopReverse(); + let playbackSpeed = 1 + speed * 0.01; + playbackSpeed = Math.max(0.5, Math.min(2, playbackSpeed)); + controlPlayback(playbackSpeed); + } } } lastPosition = position; lastTime = now; + + // Détecter l'inactivité : si pas de mise à jour pendant 300ms → stop + idleTimeout = setTimeout(() => { + stopPlayback(); + }, 300); }); // 5. Fonctions @@ -77,7 +92,9 @@ function setProgress(e) { } // Fonction pour régler la lecture selon la vitesse + function controlPlayback(speed) { + stopReverse(); // On stoppe le reverse si actif if (speed > 0) { if (!isPlaying) { audio.play(); @@ -85,13 +102,42 @@ function controlPlayback(speed) { isPlaying = true; } audio.playbackRate = speed; - } else { - if (isPlaying) { - audio.pause(); - vinyl.style.animationPlayState = 'paused'; - isPlaying = false; + } +} + +function stopPlayback() { + audio.pause(); + vinyl.style.animationPlayState = 'paused'; + isPlaying = false; +} + +function simulateReverse(speed) { + // vitesse = ticks/sec → convertir en vitesse de recul + const reverseSpeed = Math.min(speed * 0.01, 2); // seconds per step + + if (!reverseInterval) { + reverseInterval = setInterval(() => { + if (audio.currentTime > 0.05) { + audio.currentTime -= reverseSpeed * 0.1; + vinyl.style.animationPlayState = 'running'; + } else { + stopPlayback(); + } + }, 100); + + if (!isPlaying) { + isPlaying = true; } } + + audio.pause(); // on met en pause le vrai son pour éviter conflit +} + +function stopReverse() { + if (reverseInterval) { + clearInterval(reverseInterval); + reverseInterval = null; + } } // 6. Événements