From dcc91e038d806994382baa19b3d238da4a8ecaae Mon Sep 17 00:00:00 2001 From: Daniele Lubrano Date: Wed, 26 Mar 2025 14:48:47 +0100 Subject: [PATCH] fix(component): update oscillators frequency on preset change Update oscillators frequency on preset change --- src/components/modals/binaural/binaural.tsx | 28 ++++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/components/modals/binaural/binaural.tsx b/src/components/modals/binaural/binaural.tsx index 85f87c6..70512b4 100644 --- a/src/components/modals/binaural/binaural.tsx +++ b/src/components/modals/binaural/binaural.tsx @@ -25,6 +25,16 @@ const presets: Preset[] = [ { baseFrequency: 440, beatFrequency: 10, name: 'Custom' }, ]; +function computeBinauralBeatOscillatorFrequencies( + baseFrequency: number, + beatFrequency: number, +) { + return { + leftFrequency: baseFrequency - beatFrequency / 2, + rightFrequency: baseFrequency + beatFrequency / 2, + }; +} + export function BinauralModal({ onClose, show }: BinauralProps) { const [baseFrequency, setBaseFrequency] = useState(440); // Default to A4 note const [beatFrequency, setBeatFrequency] = useState(10); // Default to 10 Hz difference @@ -61,10 +71,10 @@ export function BinauralModal({ onClose, show }: BinauralProps) { ) return; - leftOscillatorRef.current.frequency.value = - baseFrequency - beatFrequency / 2; - rightOscillatorRef.current.frequency.value = - baseFrequency + beatFrequency / 2; + const { leftFrequency, rightFrequency } = + computeBinauralBeatOscillatorFrequencies(baseFrequency, beatFrequency); + leftOscillatorRef.current.frequency.value = leftFrequency; + rightOscillatorRef.current.frequency.value = rightFrequency; // Pan oscillators to left and right const leftPanner = audioContext.createStereoPanner(); @@ -104,6 +114,16 @@ export function BinauralModal({ onClose, show }: BinauralProps) { } }, [volume]); + useEffect(() => { + // Update base frequency for both left and right oscillators when it changes + if (leftOscillatorRef.current && rightOscillatorRef.current) { + const { leftFrequency, rightFrequency } = + computeBinauralBeatOscillatorFrequencies(baseFrequency, beatFrequency); + leftOscillatorRef.current.frequency.value = leftFrequency; + rightOscillatorRef.current.frequency.value = rightFrequency; + } + }, [baseFrequency, beatFrequency]); + useEffect(() => { // Cleanup when component unmounts return () => {