diff --git a/client/src/pages/Game/components/MusicSlider/MusicSlider.jsx b/client/src/pages/Game/components/MusicSlider/MusicSlider.jsx index 63045de..f74082a 100644 --- a/client/src/pages/Game/components/MusicSlider/MusicSlider.jsx +++ b/client/src/pages/Game/components/MusicSlider/MusicSlider.jsx @@ -1,6 +1,21 @@ import { useState, useEffect, useRef, useCallback } from 'react'; import "./styles.sass"; +const frequencyToNote = (frequency) => { + const A4 = 440; + const notes = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']; + + const halfSteps = Math.round(12 * Math.log2(frequency / A4)); + + const A4Index = notes.indexOf('A'); + let noteIndex = (A4Index + halfSteps) % 12; + if (noteIndex < 0) noteIndex += 12; + + const octave = 4 + Math.floor((halfSteps + A4Index) / 12); + + return `${notes[noteIndex]}${octave}`; +}; + export const MusicSlider = ({ isReadOnly, onFrequencyChange, frequency: externalFrequency, composerIsPlaying }) => { const [audioContext, setAudioContext] = useState(null); const [oscillator, setOscillator] = useState(null); @@ -187,6 +202,25 @@ export const MusicSlider = ({ isReadOnly, onFrequencyChange, frequency: external return `${Math.max(0, Math.min(pos, 100))}%`; }; + const getMouthSize = () => { + const minSize = 30; + const maxSize = 60; + const freqRange = 880; + const sizeRange = maxSize - minSize; + const relativeFreq = frequency.current - 220; + const size = minSize + (relativeFreq / freqRange) * sizeRange; + return Math.max(minSize, Math.min(maxSize, size)); + }; + + const shouldShowNoteMarker = () => { + if (!isReadOnly) return isDragging.current; + return composerIsPlaying; + }; + + if (isReadOnly && !composerIsPlaying) { + return null; + } + return (