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 () => {