Lub Dub Valves Extra Quality May 2026
.sub text-align: center; color: #a0c0e0; margin-bottom: 2rem; font-style: italic;
function activateDub() dubValveDiv.classList.add('active'); setTimeout(() => dubValveDiv.classList.remove('active'), 180); lub dub valves
function playDub() if (audioCtx.state === 'suspended') audioCtx.resume(); const now = audioCtx.currentTime; const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); osc.connect(gain); gain.connect(audioCtx.destination); osc.frequency.value = 210; // sharper gain.gain.value = 0.4; gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.22); osc.start(); osc.stop(now + 0.22); // short high ping const osc2 = audioCtx.createOscillator(); const gain2 = audioCtx.createGain(); osc2.connect(gain2); gain2.connect(audioCtx.destination); osc2.frequency.value = 430; gain2.gain.value = 0.12; gain2.gain.exponentialRampToValueAtTime(0.0001, now + 0.16); osc2.start(); osc2.stop(now + 0.16); .sub text-align: center
.valve-icon font-size: 5rem; transition: transform 0.1s ease; filter: drop-shadow(0 4px 8px rgba(0,0,0,0.5)); function activateDub() dubValveDiv.classList.add('active')
function stopAutoCycle() if (autoInterval) clearInterval(autoInterval); autoInterval = null; isAuto = false; statusSpan.innerHTML = '⚡ idle';
// ----- Animation & Valve Activation ----- const lubValveDiv = document.getElementById('lubValve'); const dubValveDiv = document.getElementById('dubValve'); const statusSpan = document.getElementById('statusMsg');
