diff --git a/src/App.jsx b/src/App.jsx index 87d7ea8..5df8590 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -8,6 +8,7 @@ import Tuner from './components/Tuner' import Piano from './components/Piano' import Settings from './components/Settings' import DebugView from './components/DebugView' +import DrumView from './components/DrumView' import { NOTES, detectKey, detectTopKeys, matchChordFromChroma, detectRepeatingProgression, getChordTones, getChordCandidates, getNoteHistoryAnalysis } from './lib/theory' import settingIcon from './assets/setting-icon.png' @@ -49,7 +50,8 @@ export default function App() { // ── Instrument view + tuner ─────────────────────────────────────────────────── const [instrument, setInstrument] = useState('piano') // 'piano' | 'guitar' | 'bass' const [showTuner, setShowTuner] = useState(false) - const [showDebug, setShowDebug] = useState(false) + const [showDebug, setShowDebug] = useState(false) + const [showDrumView, setShowDrumView] = useState(false) const [monoColor, setMonoColor] = useState(() => loadStored('wtf_monoColor', false)) // ── Mic permission error ────────────────────────────────────────────────────── @@ -63,9 +65,11 @@ export default function App() { // ── Stable refs for values used inside callbacks ────────────────────────────── const showDebugRef = useRef(showDebug) + const showDrumViewRef = useRef(showDrumView) const lockedKeyRef = useRef(null) const listenStartRef = useRef(null) useEffect(() => { showDebugRef.current = showDebug }, [showDebug]) + useEffect(() => { showDrumViewRef.current = showDrumView }, [showDrumView]) useEffect(() => { localStorage.setItem('wtf_monoColor', JSON.stringify(monoColor)) }, [monoColor]) useEffect(() => { if (isListening) listenStartRef.current = Date.now() }, [isListening]) @@ -184,9 +188,11 @@ export default function App() { effectiveKeyRef.current = keyInfo } - // ── Waveform handler: feeds oscilloscope in debug view ─────────────────────── + // ── Waveform handler: feeds oscilloscope / drum view ───────────────────────── const handleWaveform = useCallback((data) => { - if (showDebugRef.current) setDebugWaveform(data) + if (showDebugRef.current || showDrumViewRef.current) { + setDebugWaveform({ ...data, onsets: [...onsetTimestampsRef.current] }) + } }, []) // ── Note handler: drives key detection (pitch-based) ────────────────────────── @@ -569,6 +575,22 @@ export default function App() { )} + {/* ── Rhythm / drum analyser — collapsible ── */} +
+ + {showDrumView && ( +
+ +
+ )} +
+ {/* ── Tuner — collapsible ── */}