// 1. Sélection des éléments du DOM const vinyl = document.getElementById('vinyl'); const audio = document.getElementById('audio'); const progress = document.getElementById('progress'); const currentTimeEl = document.getElementById('currentTime'); const durationEl = document.getElementById('duration'); const backwardBtn = document.getElementById('backward'); const forwardBtn = document.getElementById('forward'); const loopBtn = document.getElementById('loop'); // 2. Variables utiles let isPlaying = false; let isLooping = false; // 3. Variables pour calculer la vitesse de rotation let lastPosition = null; let lastTime = null; // 4. Connexion Socket.io const socket = io(); socket.on('position', (position) => { const now = Date.now(); if (lastPosition !== null && lastTime !== null) { const deltaPos = position - lastPosition; const deltaTime = (now - lastTime) / 1000; // en secondes const speed = deltaPos / deltaTime; // ticks par seconde console.log('instant speed:', speed); // Seuil minimal pour stopper la lecture si la balle ne tourne plus if (Math.abs(speed) < 2) { controlPlayback(0); // stop } 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); } } lastPosition = position; lastTime = now; }); // 5. Fonctions function togglePlay() { if (isPlaying) { audio.pause(); vinyl.style.animationPlayState = 'paused'; } else { audio.play(); vinyl.style.animationPlayState = 'running'; } isPlaying = !isPlaying; } function updateProgress() { const progressPercent = (audio.currentTime / audio.duration) * 100; progress.value = progressPercent; currentTimeEl.textContent = formatTime(audio.currentTime); } function formatTime(time) { const minutes = Math.floor(time / 60); const seconds = Math.floor(time % 60); return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`; } function setProgress(e) { const width = progress.clientWidth; const clickX = e.offsetX; const duration = audio.duration; audio.currentTime = (clickX / width) * duration; } // Fonction pour régler la lecture selon la vitesse function controlPlayback(speed) { if (speed > 0) { if (!isPlaying) { audio.play(); vinyl.style.animationPlayState = 'running'; isPlaying = true; } audio.playbackRate = speed; } else { if (isPlaying) { audio.pause(); vinyl.style.animationPlayState = 'paused'; isPlaying = false; } } } // 6. Événements vinyl.addEventListener('click', togglePlay); audio.addEventListener('timeupdate', updateProgress); audio.addEventListener('loadedmetadata', () => { durationEl.textContent = formatTime(audio.duration); }); progress.addEventListener('click', setProgress); backwardBtn.addEventListener('click', () => { audio.currentTime = Math.max(0, audio.currentTime - 10); }); forwardBtn.addEventListener('click', () => { audio.currentTime = Math.min(audio.duration, audio.currentTime + 10); }); loopBtn.addEventListener('click', () => { isLooping = !isLooping; loopBtn.style.backgroundColor = isLooping ? 'white' : 'transparent'; loopBtn.style.color = isLooping ? '#18344b' : 'white'; }); audio.addEventListener('ended', () => { if (isLooping) { audio.currentTime = 0; audio.play(); } else { vinyl.style.animationPlayState = 'paused'; isPlaying = false; } });