diff --git a/lib/hooks/useMultiTrackPlayer.ts b/lib/hooks/useMultiTrackPlayer.ts index 1226691..3399a80 100644 --- a/lib/hooks/useMultiTrackPlayer.ts +++ b/lib/hooks/useMultiTrackPlayer.ts @@ -64,14 +64,16 @@ export function useMultiTrackPlayer(tracks: Track[], masterVolume: number = 1) { const dataArray = new Uint8Array(analyser.frequencyBinCount); analyser.getByteTimeDomainData(dataArray); - // Calculate RMS level - let sum = 0; + // Calculate peak level (more responsive than RMS for visual meters) + let peak = 0; for (let i = 0; i < dataArray.length; i++) { - const normalized = (dataArray[i] - 128) / 128; - sum += normalized * normalized; + const normalized = Math.abs((dataArray[i] - 128) / 128); + if (normalized > peak) { + peak = normalized; + } } - const rms = Math.sqrt(sum / dataArray.length); - levels[track.id] = rms; + + levels[track.id] = peak; }); setTrackLevels(levels); diff --git a/lib/hooks/useRecording.ts b/lib/hooks/useRecording.ts index b94f11d..606a98d 100644 --- a/lib/hooks/useRecording.ts +++ b/lib/hooks/useRecording.ts @@ -78,15 +78,16 @@ export function useRecording(): UseRecordingReturn { analyser.getByteTimeDomainData(dataArray); - // Calculate RMS level - let sum = 0; + // Calculate peak level (more responsive than RMS for visual meters) + let peak = 0; for (let i = 0; i < dataArray.length; i++) { - const normalized = (dataArray[i] - 128) / 128; - sum += normalized * normalized; + const normalized = Math.abs((dataArray[i] - 128) / 128); + if (normalized > peak) { + peak = normalized; + } } - const rms = Math.sqrt(sum / dataArray.length); - setState((prev) => ({ ...prev, inputLevel: rms })); + setState((prev) => ({ ...prev, inputLevel: peak })); animationFrameRef.current = requestAnimationFrame(updateLevel); };