From 42b65b2a30d11578090a0c9d22143f2cce167cf4 Mon Sep 17 00:00:00 2001 From: b1rdmania <102524336+b1rdmania@users.noreply.github.com> Date: Tue, 20 Jan 2026 19:47:12 +0000 Subject: [PATCH] Add STOP ALL button to v2-test.html with node tracking --- v2-test.html | 52 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/v2-test.html b/v2-test.html index e9fab7c..fcac19f 100644 --- a/v2-test.html +++ b/v2-test.html @@ -235,6 +235,7 @@
+
@@ -270,11 +271,36 @@ let audioContext = null; let channels = null; + const activeNodes = new Set(); const logEl = document.getElementById('log'); const statusEl = document.getElementById('status'); const verificationEl = document.getElementById('verification-results'); + // Helper to track and auto-cleanup nodes + function trackNode(node) { + activeNodes.add(node); + node.onended = () => activeNodes.delete(node); + return node; + } + + // Stop all playing sounds + function stopAll() { + if (audioContext) { + const now = audioContext.currentTime; + for (const node of activeNodes) { + try { + node.stop(now); + } catch (e) { + // Already stopped + } + } + activeNodes.clear(); + addLog('All sounds stopped', 'info'); + setStatus('Ready'); + } + } + // Override console.log to show in UI const originalLog = console.log; console.log = (...args) => { @@ -359,44 +385,56 @@ setStatus('Ready'); }); + // Stop button + document.getElementById('btn-stop').addEventListener('click', () => { + stopAll(); + }); + // Quick sound checks document.getElementById('btn-note-c').addEventListener('click', async () => { await ensureAudioContext(); channels.pulse.setDutyCycle(2); - channels.pulse.playNote(60, 0.3, 100); + const result = channels.pulse.playNote(60, 0.3, 100); + trackNode(result.oscillator); }); document.getElementById('btn-note-e').addEventListener('click', async () => { await ensureAudioContext(); channels.pulse.setDutyCycle(1); - channels.pulse.playNote(64, 0.3, 100); + const result = channels.pulse.playNote(64, 0.3, 100); + trackNode(result.oscillator); }); document.getElementById('btn-note-g').addEventListener('click', async () => { await ensureAudioContext(); channels.pulse.setDutyCycle(0); - channels.pulse.playNote(67, 0.3, 100); + const result = channels.pulse.playNote(67, 0.3, 100); + trackNode(result.oscillator); }); document.getElementById('btn-bass').addEventListener('click', async () => { await ensureAudioContext(); channels.wave.loadPreset('bass'); - channels.wave.playNote(36, 0.5, 100); + const result = channels.wave.playNote(36, 0.5, 100); + trackNode(result.oscillator); }); document.getElementById('btn-kick').addEventListener('click', async () => { await ensureAudioContext(); - channels.noise.playKick(100); + const result = channels.noise.playKick(100); + if (result) trackNode(result.source); }); document.getElementById('btn-snare').addEventListener('click', async () => { await ensureAudioContext(); - channels.noise.playSnare(100); + const result = channels.noise.playSnare(100); + if (result) trackNode(result.source); }); document.getElementById('btn-hihat').addEventListener('click', async () => { await ensureAudioContext(); - channels.noise.playHihat(80, false); + const result = channels.noise.playHihat(80, false); + if (result) trackNode(result.source); }); addLog('Wario Synth v2 Test Page loaded', 'success');