{"ast":null,"code":"var _jsxFileName = \"D:\\\\Project\\\\UC_Trains_Voice\\\\react-demo\\\\src\\\\Canvas\\\\Fixed.tsx\",\n  _s = $RefreshSig$();\nimport React, { useEffect, useRef, useState } from 'react';\nimport { map, drawBackground } from '../function/canvasDefault';\nimport { getPitch } from '../function/getPitch';\nimport { Col, Row } from 'antd';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nconst style = {\n  display: 'relative',\n  height: 300\n};\nconst Fixed = ({\n  setMaxLyricCount,\n  setIsListen,\n  isListen,\n  initialRange,\n  divisor,\n  isRetry,\n  setPlayingPause,\n  setPlaying,\n  gender,\n  genderName,\n  isFixed,\n  onAudioSrcChange,\n  setBaseFilenames,\n  syllableCount,\n  onPlayLyricCountChange,\n  config,\n  COLORS,\n  size,\n  playCount,\n  playLyricCount,\n  isPlaying,\n  showNotesPar\n}) => {\n  _s();\n  const [pitch, setPitch] = useState(null);\n  const {\n    realVoiceColor,\n    targetVoiceColor,\n    closeVoiceColor\n  } = COLORS;\n  const {\n    SRATE,\n    fxmin,\n    fxlow,\n    fxhigh,\n    fxmax\n  } = config;\n  const [mouseHeight, setMouseHeight] = useState(0);\n  const [shouldDisabled, setShouldDisabled] = useState(false);\n  // const [pitchValue, setPitchValue] = useState<number | null>(null);\n  const [ballY, setBallY] = useState(size[0]);\n  const [ballYCurr, setBallYCurr] = useState(size[0]);\n  const canvasRef = useRef(null);\n  const rectWidth = 5;\n  const spedinter = 5;\n  const divisorLocal = 4;\n  const cornerRadius = 1;\n  const offset = 20;\n  const desiredLength = Math.floor(size[1] / divisor);\n  // const desiredLengthBall = Math.floor(size[1] / 5 / 4);\n  const [resetOnPlay, setResetOnPlay] = useState(false);\n  const CanvasLength = size[1]; // 1400\n  // const [CanvasLengthBall,setCanvasLengthBall] = useState<number>(size[1] * ballPosition);\n  // const initialCustomHistoryFull = new Array(CanvasLength).fill(NaN);\n  const initialColorChangesFull = new Array(CanvasLength).fill(false);\n  const initialBallHistoryFull = new Array(CanvasLength).fill(NaN);\n  // const [customHistoryFull, setCustomHistoryFull] = useState<number[]>(initialCustomHistoryFull);\n  const [colorChangesFull, setColorChangesFull] = useState(initialColorChangesFull);\n  const [ballHistoryFull, setBallHistoryFull] = useState(initialBallHistoryFull);\n  const resetStatesFull = () => {\n    // setCustomHistoryFull([...initialCustomHistoryFull]);\n    setColorChangesFull([...initialColorChangesFull]);\n    setBallHistoryFull([...initialBallHistoryFull]);\n    setCurrentX(initialcurrentX);\n  };\n  // const [ballHistory, setBallHistory] = useState<number[]>(new Array(desiredLength).fill(NaN));\n  // const [colorChanges, setColorChanges] = useState<boolean[]>(new Array(desiredLength).fill(true));\n  const initialColorChanges = new Array(desiredLength).fill(true);\n  const initialBallHistory = new Array(desiredLength).fill(NaN);\n  const initialcurrentX = 0;\n  const [colorChanges, setColorChanges] = useState(initialColorChanges);\n  const [ballHistory, setBallHistory] = useState(initialBallHistory);\n  const resetStates = () => {\n    setColorChanges([...initialColorChanges]);\n    setBallHistory([...initialBallHistory]);\n    setCurrentX(initialcurrentX);\n  };\n  const [showNotes, setShowNotes] = useState(false);\n  const [pitchArray, setPitchArray] = useState([]);\n  // const audioSrc = \"/audio/Right across the street.wav\";\n  // const audioRef = useRef(new Audio(audioSrc)); \n  const [currentX, setCurrentX] = useState(initialcurrentX);\n  const [jsonFiles, setJsonFiles] = useState([]);\n  const [audioSrc, setAudioSrc] = useState('');\n  const [canvasHeight, setCanvasHeight] = useState(0);\n  const handleMouseMove = event => {\n    if (canvasRef.current) {\n      const rect = canvasRef.current.getBoundingClientRect();\n      const y = event.clientY - rect.top;\n      const heightPercentage = y / rect.height * 100;\n      setMouseHeight(heightPercentage);\n      // console.log(heightPercentage);\n    }\n  };\n  function parseTimeToSeconds(timeString) {\n    // Parse the time string in the format \"HH:MM:SS:FF\" to seconds\n    const parts = timeString.split(\":\");\n    const hours = parseInt(parts[0], 10);\n    const minutes = parseInt(parts[1], 10);\n    const seconds = parseInt(parts[2], 10);\n    const frames = parseInt(parts[3], 10);\n    const frameDurationInSeconds = frames / 100;\n    return hours * 3600 + minutes * 60 + seconds + frameDurationInSeconds;\n  }\n  function generatePitchArrayFromJson(jsonData) {\n    // const pitchArray = [];\n    const pitchArray = [];\n    const newdArray = [];\n    const data = jsonData;\n    let previousTimeInSeconds = 0;\n    let previousPitch = 0;\n    for (let i = 0; i < data.length; i++) {\n      const currentTimeInSeconds = parseTimeToSeconds(data[i].time);\n      const timeDifference = currentTimeInSeconds - previousTimeInSeconds;\n\n      // Fill the array with the previous pitch value for the duration of timeDifference\n      for (let j = 0; j < timeDifference * 100; j++) {\n        pitchArray.push(previousPitch);\n      }\n      previousTimeInSeconds = currentTimeInSeconds;\n      previousPitch = data[i].pitch;\n    }\n\n    // Ensure the array ends at the last time point\n    const endTimeInSeconds = parseTimeToSeconds(data[data.length - 1].time);\n    const endTimeDifference = endTimeInSeconds - previousTimeInSeconds;\n    for (let j = 0; j < endTimeDifference * 100; j++) {\n      pitchArray.push(previousPitch);\n    }\n    const extendedArray = [];\n    pitchArray.forEach(pitch => {\n      extendedArray.push(pitch);\n      for (let i = 0; i < divisorLocal; i++) {\n        extendedArray.push(pitch);\n      }\n    });\n    while (extendedArray.length > 1400) {\n      extendedArray.pop();\n    }\n    while (extendedArray.length < 1400) {\n      extendedArray.push(0);\n    }\n    return extendedArray;\n\n    // return pitchArray;\n  }\n  function updateBallY(value) {\n    if (value === null) {\n      value = 0;\n    }\n    if (value <= initialRange[0]) {\n      // setBallY(size[0] + 10);\n      setBallYCurr(size[0]);\n    } else if (value > initialRange[1]) {\n      // setBallY(map(value, initialRange[0], initialRange[1], size[0], -1));\n      setBallYCurr(0);\n    } else {\n      // console.log(value);\n      // setBallY(map(value, initialRange[0], initialRange[1], size[0], -1));\n      setBallYCurr(map(value, initialRange[0], initialRange[1], size[0], -1));\n    }\n  }\n  const updateCanvasHeight = () => {\n    if (canvasRef.current) {\n      const rect = canvasRef.current.getBoundingClientRect();\n      setCanvasHeight(rect.height);\n    }\n  };\n  useEffect(() => {\n    const canvas = canvasRef.current;\n    if (canvas) {\n      const ctx = canvas.getContext('2d');\n      if (ctx) {\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\n        drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\n\n        // ctx.font = '16px Arial';\n        // ctx.fillStyle = 'black';\n        // // Calculate text position (near top right corner)\n        // const textX = canvas.width - 100;\n        // const textY = 20;\n        // // txt\n        // const mappedHeight = map(mouseHeight, 0, 100, initialRange[1], initialRange[0]);\n        // ctx.fillText(`pitch: ${mappedHeight.toFixed(2)}`, textX, textY);\n\n        for (let i = 0 + offset; i < pitchArray.length; i++) {\n          const mappedJsonValue = map(pitchArray[i], initialRange[0], initialRange[1], size[0], 0);\n          // Set fill color based on condition\n          if (colorChangesFull[i]) {\n            ctx.fillStyle = closeVoiceColor;\n          } else {\n            ctx.fillStyle = targetVoiceColor;\n          }\n\n          // Draw a rectangle\n          ctx.fillRect(i, mappedJsonValue, rectWidth, rectWidth);\n        }\n        for (var i = 0; i < ballHistoryFull.length; i++) {\n          ctx.beginPath();\n          const mappedValue = map(ballHistoryFull[i], initialRange[0], initialRange[1], size[0], -1);\n          ctx.arc(i, mappedValue, 5, 0, 2 * Math.PI);\n          ctx.fillStyle = realVoiceColor;\n          ctx.fill();\n          ctx.closePath();\n        }\n\n        // Plot current value\n        ctx.beginPath();\n        ctx.arc(currentX * divisor, ballYCurr, 10, 0, 2 * Math.PI);\n        ctx.fillStyle = \"black\";\n        ctx.fill();\n        ctx.closePath();\n      }\n    }\n  }, [initialRange, pitchArray, ballHistoryFull, showNotes, showNotesPar]);\n  useEffect(() => {\n    const canvas = canvasRef.current;\n    if (canvas) {\n      const ctx = canvas.getContext('2d');\n      if (ctx) {\n        // ctx.clearRect(0, 0, canvas.width, canvas.height);\n        // drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\n\n        ctx.font = '16px Arial';\n        ctx.fillStyle = 'black';\n        // Calculate text position (near top right corner)\n        const textX = canvas.width - 100;\n        const textY = 20;\n        // txt\n        const mappedHeight = map(mouseHeight, 0, 100, initialRange[1], initialRange[0]);\n        const text = `pitch: ${mappedHeight.toFixed(2)}`;\n        const metrics = ctx.measureText(text);\n        const textWidth = metrics.width;\n        const textHeight = 16;\n        const clearX = textX;\n        const clearY = textY - textHeight;\n        const clearWidth = textWidth;\n        const clearHeight = textHeight + 5;\n        ctx.clearRect(clearX, clearY, clearWidth, clearHeight);\n        ctx.fillText(`pitch: ${mappedHeight.toFixed(2)}`, textX, textY);\n      }\n    }\n  }, [mouseHeight]);\n  useEffect(() => {\n    resetStatesFull();\n    setPlayingPause();\n    const canvas = canvasRef.current;\n    let animationFrameId;\n    if (isListen > 1 && canvas) {\n      const ctx = canvas.getContext('2d');\n      if (ctx) {\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\n        drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\n        ctx.font = '16px Arial';\n        ctx.fillStyle = 'black';\n        const textX = canvas.width - 100;\n        const textY = 20;\n        const mappedHeight = map(mouseHeight, 0, 100, initialRange[1], initialRange[0]);\n        ctx.fillText(`pitch: ${mappedHeight.toFixed(2)}`, textX, textY);\n        let drawnUntil = 0;\n        let lastFrameTime = Date.now();\n        const draw = () => {\n          const now = Date.now();\n          const deltaTime = now - lastFrameTime;\n          const elementsPerFrame = deltaTime / (1000 / 6) * 135;\n          // console.log(elementsPerFrame)\n          for (let j = 0; j < elementsPerFrame && drawnUntil < pitchArray.length; j++, drawnUntil++) {\n            const i = drawnUntil;\n            const mappedJsonValue = map(pitchArray[drawnUntil], initialRange[0], initialRange[1], size[0], 0);\n            ctx.fillStyle = closeVoiceColor;\n            ctx.fillRect(i, mappedJsonValue, rectWidth + 3, rectWidth + 3);\n          }\n          if (drawnUntil < pitchArray.length) {\n            lastFrameTime = now; // 更新上一帧的时间\n            animationFrameId = requestAnimationFrame(draw);\n          } else {\n            cancelAnimationFrame(animationFrameId);\n          }\n        };\n        draw();\n        return () => {\n          if (animationFrameId) {\n            cancelAnimationFrame(animationFrameId);\n          }\n        };\n      }\n    }\n  }, [isListen, pitchArray]);\n  useEffect(() => {\n    setIsListen(1);\n  }, [pitchArray]);\n  // retry\n  useEffect(() => {\n    setPlayingPause();\n    // resetStates();\n    resetStatesFull();\n  }, [isRetry, divisor]);\n\n  // next\n  useEffect(() => {\n    setPlayingPause();\n    // resetStates();\n    resetStatesFull();\n  }, [playLyricCount]);\n\n  // first\n  useEffect(() => {\n    setPlayingPause();\n    console.log(\"pause\");\n    drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\n\n    // get pitch\n    let cleanup;\n    (async () => {\n      cleanup = await getPitch(config, setPitch);\n    })();\n    return () => {\n      cleanup && cleanup();\n    };\n  }, []);\n  // first \n  useEffect(() => {\n    console.log(showNotesPar);\n    let cleanup;\n    // Set the Canvas height when mounting the component for the first time\n    updateCanvasHeight();\n\n    // Set up resize event listener\n    window.addEventListener('resize', updateCanvasHeight);\n    return () => {\n      cleanup && cleanup();\n      window.removeEventListener('resize', updateCanvasHeight);\n    };\n  }, []);\n  useEffect(() => {\n    if (canvasRef.current) {\n      const rect = canvasRef.current.getBoundingClientRect();\n      setCanvasHeight(rect.height);\n    }\n  }, []);\n  useEffect(() => {\n    let url = '';\n    if (gender === 'male') {\n      url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/list.json';\n    } else {\n      url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/list.json';\n    }\n    console.log(url);\n    console.log('playlyriccount', playLyricCount);\n    if (jsonFiles.length > playLyricCount) {\n      // Get the correct filename based on playLyricCount\n      const filename = jsonFiles[playLyricCount];\n\n      // fetch(`http://127.0.0.1:8000/data/${syllableCount}/${gender}/${filename}`)\n\n      if (gender === 'male') {\n        url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/' + filename;\n      } else {\n        url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/' + filename;\n      }\n      console.log('file url --------------->', url);\n      fetch(url).then(response => {\n        if (!response.ok) {\n          throw new Error('Network response was not ok');\n        }\n        return response.json();\n      }).then(data => {\n        const pitches = generatePitchArrayFromJson(data.data);\n        setPitchArray(pitches);\n      }).catch(error => {\n        console.error('Error fetching the JSON file:', error);\n      });\n    }\n  }, [playLyricCount, jsonFiles]);\n  useEffect(() => {\n    let url = '';\n    if (gender === 'male') {\n      url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/list.json';\n    } else {\n      url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/list.json';\n    }\n    // const url = `https://ceas5.uc.edu/transvoice/jsonDataOm/${gender}/${genderName}/${syllableCount}syllable/list.json`;\n\n    fetch(url).then(response => {\n      if (!response.ok) {\n        throw new Error('Network response was not ok');\n      }\n      return response.json();\n    }).then(data => {\n      console.log(data.base_filenames); // Print base file name\n      setJsonFiles(data.json_files);\n      const modifiedArray = data.base_filenames.map(element => element.replaceAll('_', ' ')); // replace all occurrences of underscore\n      setMaxLyricCount(data.base_filenames.length - 1);\n      setBaseFilenames(modifiedArray);\n\n      // Check if there is a file name\n      if (data.base_filenames.length > 0) {\n        // Get the contents of the first file\n        let url = '';\n        if (gender === 'male') {\n          url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/' + data.json_files[0];\n        } else {\n          url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/' + data.json_files[0];\n        }\n        return fetch(url);\n      } else {\n        throw new Error('No files available');\n      }\n    }).then(response => {\n      if (!response.ok) {\n        throw new Error('Network response was not ok');\n      }\n      return response.json();\n    }).then(firstFileData => {\n      console.log(firstFileData); // Print the contents of the first file\n      const pitches = generatePitchArrayFromJson(firstFileData.data);\n      // console.log(pitches);\n      setPitchArray(pitches);\n    }).catch(error => {\n      console.error('Error:', error);\n    });\n    onPlayLyricCountChange(0);\n  }, [gender, genderName, syllableCount]);\n  useEffect(() => {\n    if (jsonFiles.length > 0) {\n      // Construct the URL of the audio file\n      // const audioFilename = `${gender}-${jsonFiles[0]}.wav`;\n      let audioFilename = '';\n      let audioUrl = '';\n      if (gender === 'male') {\n        audioFilename = `${gender}-${jsonFiles[playLyricCount].replace('.json', '')}.wav`;\n        audioUrl = `https://ceas5.uc.edu/transvoice/audio/${syllableCount}/${gender}/${audioFilename}`;\n      } else {\n        audioFilename = `${genderName}-${gender}-${jsonFiles[playLyricCount].replace('.json', '')}.wav`;\n        audioUrl = `https://ceas5.uc.edu/transvoice/audioOm/${gender}/${genderName}/${syllableCount}syllable/${audioFilename}`;\n      }\n      setAudioSrc(audioUrl);\n    }\n  }, [syllableCount, gender, playLyricCount, jsonFiles]);\n  useEffect(() => {\n    onAudioSrcChange(audioSrc);\n  }, [audioSrc, onAudioSrcChange]);\n\n  // Change note function\n  const toggleShowNotes = () => {\n    setShowNotes(!showNotes);\n    const canvas = canvasRef.current;\n    if (canvas && canvas.getContext) {\n      const ctx = canvas.getContext('2d');\n      if (ctx) {\n        ctx.clearRect(0, 0, canvas.width / 24, canvas.height);\n        drawBackground(canvasRef, initialRange[1], initialRange[0], !showNotes);\n      }\n    }\n  };\n\n  // Redraw the background\n  useEffect(() => {\n    drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes); // Make sure the background is redrawn on state change\n  }, [showNotes]);\n  const updateBallHistoryFull = pitch => {\n    let tempHistoryFull = [...ballHistoryFull];\n    let ctxdiv = currentX * divisor;\n    let ballYtem = map(pitch, initialRange[0], initialRange[1], size[0], -1);\n    if (currentX < desiredLength - 1) {\n      setShouldDisabled(false);\n      tempHistoryFull[ctxdiv] = pitch;\n      setColorChangesFull(currentColors => {\n        const newColors = [...currentColors];\n        const mappedJsonValue = map(pitchArray[ctxdiv], initialRange[0], initialRange[1], size[0], 0);\n        const difference = Math.abs(mappedJsonValue - ballYtem);\n        if (difference <= 50 && !isNaN(difference)) {\n          for (let j = ctxdiv - divisor; j <= ctxdiv + divisor && j < CanvasLength; j++) {\n            newColors[j] = true;\n          }\n        }\n        return newColors;\n      });\n    } else {\n      setShouldDisabled(true);\n      if (!shouldDisabled) {\n        setPlayingPause();\n      }\n    }\n    setCurrentX(currentX + 1);\n    setBallHistoryFull(tempHistoryFull);\n  };\n  useEffect(() => {\n    if (isPlaying) {\n      updateBallY(pitch);\n    }\n  }, [pitch]);\n  useEffect(() => {\n    if (isPlaying) {\n      // updateBallHistoryFull(pitch);\n      if (pitch !== null) {\n        updateBallHistoryFull(pitch);\n      } else {\n        updateBallHistoryFull(0);\n      }\n    }\n  }, [pitch, isPlaying]);\n  useEffect(() => {\n    if (shouldDisabled && isPlaying) {\n      resetStatesFull();\n      setShouldDisabled(false);\n    }\n  }, [isPlaying]);\n\n  // Adjust notes\n  useEffect(() => {\n    console.log(showNotesPar);\n    setShowNotes(showNotesPar);\n    const canvas = canvasRef.current;\n    if (canvas && canvas.getContext) {\n      const ctx = canvas.getContext('2d');\n      if (ctx) {\n        ctx.clearRect(0, 0, canvas.width / 24, canvas.height);\n        drawBackground(canvasRef, initialRange[1], initialRange[0], !showNotes);\n      }\n    }\n  }, [showNotesPar]);\n  return /*#__PURE__*/_jsxDEV(Row, {\n    style: {\n      maxHeight: \"27vw\",\n      maxWidth: \"100vw\"\n    },\n    children: [/*#__PURE__*/_jsxDEV(Col, {\n      span: 1\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 612,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(Col, {\n      span: 22,\n      children: /*#__PURE__*/_jsxDEV(\"div\", {\n        style: {\n          position: 'relative',\n          height: canvasHeight\n        },\n        children: [/*#__PURE__*/_jsxDEV(\"div\", {\n          className: \"blueAxis\",\n          style: {\n            height: canvasHeight\n          },\n          children: showNotes ? 'Pitch / (Note)' : 'Pitch / (Hz)'\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 616,\n          columnNumber: 9\n        }, this), /*#__PURE__*/_jsxDEV(\"canvas\", {\n          onMouseMove: handleMouseMove,\n          ref: canvasRef,\n          onClick: toggleShowNotes,\n          id: \"pitchCanvas\",\n          width: size[1],\n          height: size[0],\n          style: {\n            border: '1px solid #000'\n          }\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 624,\n          columnNumber: 11\n        }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n          style: {\n            position: 'absolute',\n            top: canvasHeight,\n            left: 0,\n            // right: 0,\n            width: canvasHeight * 3.5,\n            display: 'flex',\n            justifyContent: 'space-between',\n            fontSize: '12px',\n            marginLeft: '3vw'\n          },\n          children: [...Array(11)].map((_, index) => /*#__PURE__*/_jsxDEV(\"span\", {\n            children: [(15 / (divisor / 4) * (index / 10)).toFixed(1), \"s\"]\n          }, index, true, {\n            fileName: _jsxFileName,\n            lineNumber: 640,\n            columnNumber: 3\n          }, this))\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 625,\n          columnNumber: 11\n        }, this)]\n      }, void 0, true, {\n        fileName: _jsxFileName,\n        lineNumber: 615,\n        columnNumber: 9\n      }, this)\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 614,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(Col, {\n      span: 1\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 649,\n      columnNumber: 7\n    }, this)]\n  }, void 0, true, {\n    fileName: _jsxFileName,\n    lineNumber: 610,\n    columnNumber: 5\n  }, this);\n};\n_s(Fixed, \"Rk7UHzdOwekSBe5OEEf17SVKB9M=\");\n_c = Fixed;\nexport default Fixed;\nvar _c;\n$RefreshReg$(_c, \"Fixed\");","map":{"version":3,"names":["React","useEffect","useRef","useState","map","drawBackground","getPitch","Col","Row","jsxDEV","_jsxDEV","style","display","height","Fixed","setMaxLyricCount","setIsListen","isListen","initialRange","divisor","isRetry","setPlayingPause","setPlaying","gender","genderName","isFixed","onAudioSrcChange","setBaseFilenames","syllableCount","onPlayLyricCountChange","config","COLORS","size","playCount","playLyricCount","isPlaying","showNotesPar","_s","pitch","setPitch","realVoiceColor","targetVoiceColor","closeVoiceColor","SRATE","fxmin","fxlow","fxhigh","fxmax","mouseHeight","setMouseHeight","shouldDisabled","setShouldDisabled","ballY","setBallY","ballYCurr","setBallYCurr","canvasRef","rectWidth","spedinter","divisorLocal","cornerRadius","offset","desiredLength","Math","floor","resetOnPlay","setResetOnPlay","CanvasLength","initialColorChangesFull","Array","fill","initialBallHistoryFull","NaN","colorChangesFull","setColorChangesFull","ballHistoryFull","setBallHistoryFull","resetStatesFull","setCurrentX","initialcurrentX","initialColorChanges","initialBallHistory","colorChanges","setColorChanges","ballHistory","setBallHistory","resetStates","showNotes","setShowNotes","pitchArray","setPitchArray","currentX","jsonFiles","setJsonFiles","audioSrc","setAudioSrc","canvasHeight","setCanvasHeight","handleMouseMove","event","current","rect","getBoundingClientRect","y","clientY","top","heightPercentage","parseTimeToSeconds","timeString","parts","split","hours","parseInt","minutes","seconds","frames","frameDurationInSeconds","generatePitchArrayFromJson","jsonData","newdArray","data","previousTimeInSeconds","previousPitch","i","length","currentTimeInSeconds","time","timeDifference","j","push","endTimeInSeconds","endTimeDifference","extendedArray","forEach","pop","updateBallY","value","updateCanvasHeight","canvas","ctx","getContext","clearRect","width","mappedJsonValue","fillStyle","fillRect","beginPath","mappedValue","arc","PI","closePath","font","textX","textY","mappedHeight","text","toFixed","metrics","measureText","textWidth","textHeight","clearX","clearY","clearWidth","clearHeight","fillText","animationFrameId","drawnUntil","lastFrameTime","Date","now","draw","deltaTime","elementsPerFrame","requestAnimationFrame","cancelAnimationFrame","console","log","cleanup","window","addEventListener","removeEventListener","url","filename","fetch","then","response","ok","Error","json","pitches","catch","error","base_filenames","json_files","modifiedArray","element","replaceAll","firstFileData","audioFilename","audioUrl","replace","toggleShowNotes","updateBallHistoryFull","tempHistoryFull","ctxdiv","ballYtem","currentColors","newColors","difference","abs","isNaN","maxHeight","maxWidth","children","span","fileName","_jsxFileName","lineNumber","columnNumber","position","className","onMouseMove","ref","onClick","id","border","left","justifyContent","fontSize","marginLeft","_","index","_c","$RefreshReg$"],"sources":["D:/Project/UC_Trains_Voice/react-demo/src/Canvas/Fixed.tsx"],"sourcesContent":["import React, { useContext, useEffect, useRef, useState } from 'react';\r\nimport { adjustCanvasScale, map, drawBackground } from '../function/canvasDefault';\r\nimport { getPitch, IPitchDetectionConfig } from '../function/getPitch';\r\nimport { Col, Row } from 'antd';\r\nimport { SearchOutlined } from '@ant-design/icons';\r\nimport { Button, Flex, Tooltip } from 'antd';\r\nimport { url } from 'inspector';\r\ninterface Config {\r\n  SRATE: number;\r\n  fxmin: number;\r\n  fxlow: number;\r\n  fxhigh: number;\r\n  fxmax: number;\r\n}\r\ninterface COLORS {\r\n  realVoiceColor: string;\r\n  targetVoiceColor: string,\r\n  closeVoiceColor: string,\r\n}\r\ninterface FixedProps {\r\n  size: number[];\r\n  config: Config;\r\n  isPlaying: boolean;\r\n  COLORS: COLORS;\r\n  showNotesPar: boolean;\r\n  playCount: number;\r\n  playLyricCount: number;\r\n  gender: string;\r\n  syllableCount: string;\r\n  genderName: string;\r\n  isFixed: boolean;\r\n  onPlayLyricCountChange: (newCount: number) => void;\r\n  setBaseFilenames: (filenames: string[]) => void;\r\n  onAudioSrcChange: (newAudioSrc: string) => void;\r\n  setPlaying: () => void;\r\n  isRetry: boolean;\r\n  setPlayingPause: () => void;\r\n  divisor: number;\r\n  initialRange: number[];\r\n  isListen: number;\r\n  setIsListen: (num: number) => void;\r\n  setMaxLyricCount: (num: number) => void;\r\n  // femalenNmae: string;\r\n}\r\nconst style: React.CSSProperties = {\r\n  display: 'relative',\r\n  height: 300,\r\n};\r\n\r\nconst Fixed: React.FC<FixedProps> = ({ setMaxLyricCount, setIsListen, isListen, initialRange, divisor, isRetry, setPlayingPause, setPlaying, gender, genderName, isFixed, onAudioSrcChange, setBaseFilenames, syllableCount, onPlayLyricCountChange, config, COLORS, size, playCount, playLyricCount, isPlaying, showNotesPar }) => {\r\n  const [pitch, setPitch] = useState<number | null>(null);\r\n  const { realVoiceColor, targetVoiceColor, closeVoiceColor } = COLORS;\r\n  const { SRATE, fxmin, fxlow, fxhigh, fxmax } = config;\r\n  const [mouseHeight, setMouseHeight] = useState<number>(0);\r\n  const [shouldDisabled, setShouldDisabled] = useState<boolean>(false);\r\n  // const [pitchValue, setPitchValue] = useState<number | null>(null);\r\n  const [ballY, setBallY] = useState<number>(size[0]);\r\n  const [ballYCurr, setBallYCurr] = useState<number>(size[0]);\r\n  const canvasRef = useRef<HTMLCanvasElement>(null);\r\n  const rectWidth = 5;\r\n  const spedinter = 5;\r\n  const divisorLocal = 4;\r\n  const cornerRadius = 1;\r\n  const offset = 20;\r\n  const desiredLength = Math.floor(size[1] / divisor);\r\n  // const desiredLengthBall = Math.floor(size[1] / 5 / 4);\r\n  const [resetOnPlay, setResetOnPlay] = useState(false);\r\n\r\n  const CanvasLength = size[1]; // 1400\r\n  // const [CanvasLengthBall,setCanvasLengthBall] = useState<number>(size[1] * ballPosition);\r\n  // const initialCustomHistoryFull = new Array(CanvasLength).fill(NaN);\r\n  const initialColorChangesFull = new Array(CanvasLength).fill(false);\r\n  const initialBallHistoryFull = new Array(CanvasLength).fill(NaN);\r\n  // const [customHistoryFull, setCustomHistoryFull] = useState<number[]>(initialCustomHistoryFull);\r\n  const [colorChangesFull, setColorChangesFull] = useState<boolean[]>(initialColorChangesFull);\r\n  const [ballHistoryFull, setBallHistoryFull] = useState<number[]>(initialBallHistoryFull);\r\n  const resetStatesFull = () => {\r\n    // setCustomHistoryFull([...initialCustomHistoryFull]);\r\n    setColorChangesFull([...initialColorChangesFull]);\r\n    setBallHistoryFull([...initialBallHistoryFull]);\r\n    setCurrentX(initialcurrentX);\r\n  };\r\n  // const [ballHistory, setBallHistory] = useState<number[]>(new Array(desiredLength).fill(NaN));\r\n  // const [colorChanges, setColorChanges] = useState<boolean[]>(new Array(desiredLength).fill(true));\r\n  const initialColorChanges = new Array(desiredLength).fill(true);\r\n  const initialBallHistory = new Array(desiredLength).fill(NaN);\r\n  const initialcurrentX = 0;\r\n  const [colorChanges, setColorChanges] = useState<boolean[]>(initialColorChanges);\r\n  const [ballHistory, setBallHistory] = useState<number[]>(initialBallHistory);\r\n  const resetStates = () => {\r\n    setColorChanges([...initialColorChanges]);\r\n    setBallHistory([...initialBallHistory]);\r\n    setCurrentX(initialcurrentX);\r\n  };\r\n\r\n  const [showNotes, setShowNotes] = useState(false);\r\n  const [pitchArray, setPitchArray] = useState<number[]>([]);\r\n  // const audioSrc = \"/audio/Right across the street.wav\";\r\n  // const audioRef = useRef(new Audio(audioSrc)); \r\n  const [currentX, setCurrentX] = useState(initialcurrentX);\r\n  const [jsonFiles, setJsonFiles] = useState<string[]>([]);\r\n  const [audioSrc, setAudioSrc] = useState<string>('');\r\n  const [canvasHeight, setCanvasHeight] = useState(0);\r\n  const handleMouseMove = (event: React.MouseEvent<HTMLCanvasElement>) => {\r\n    if (canvasRef.current) {\r\n      const rect = canvasRef.current.getBoundingClientRect();\r\n      const y = event.clientY - rect.top;\r\n      const heightPercentage = (y / rect.height) * 100;\r\n      setMouseHeight(heightPercentage);\r\n      // console.log(heightPercentage);\r\n    }\r\n  };\r\n\r\n  function parseTimeToSeconds(timeString: string): number {\r\n    // Parse the time string in the format \"HH:MM:SS:FF\" to seconds\r\n    const parts = timeString.split(\":\");\r\n    const hours = parseInt(parts[0], 10);\r\n    const minutes = parseInt(parts[1], 10);\r\n    const seconds = parseInt(parts[2], 10);\r\n    const frames = parseInt(parts[3], 10);\r\n    const frameDurationInSeconds = frames / 100;\r\n\r\n    return hours * 3600 + minutes * 60 + seconds + frameDurationInSeconds;\r\n  }\r\n\r\n  function generatePitchArrayFromJson(jsonData: any[]): number[] {\r\n    // const pitchArray = [];\r\n    const pitchArray: number[] = [];\r\n    const newdArray = [];\r\n    const data = jsonData;\r\n    let previousTimeInSeconds = 0;\r\n    let previousPitch = 0;\r\n\r\n    for (let i = 0; i < data.length; i++) {\r\n      const currentTimeInSeconds = parseTimeToSeconds(data[i].time);\r\n      const timeDifference = currentTimeInSeconds - previousTimeInSeconds;\r\n\r\n      // Fill the array with the previous pitch value for the duration of timeDifference\r\n      for (let j = 0; j < timeDifference * 100; j++) {\r\n        pitchArray.push(previousPitch);\r\n      }\r\n\r\n      previousTimeInSeconds = currentTimeInSeconds;\r\n      previousPitch = data[i].pitch;\r\n    }\r\n\r\n    // Ensure the array ends at the last time point\r\n    const endTimeInSeconds = parseTimeToSeconds(data[data.length - 1].time);\r\n    const endTimeDifference = endTimeInSeconds - previousTimeInSeconds;\r\n    for (let j = 0; j < endTimeDifference * 100; j++) {\r\n      pitchArray.push(previousPitch);\r\n    }\r\n    const extendedArray: number[] = [];\r\n    pitchArray.forEach((pitch) => {\r\n      extendedArray.push(pitch);\r\n      for (let i = 0; i < divisorLocal; i++) {\r\n        extendedArray.push(pitch);\r\n      }\r\n    });\r\n\r\n    while (extendedArray.length > 1400) {\r\n      extendedArray.pop();\r\n    }\r\n    while (extendedArray.length < 1400) {\r\n      extendedArray.push(0);\r\n    }\r\n\r\n    return extendedArray;\r\n\r\n    // return pitchArray;\r\n  }\r\n\r\n  function updateBallY(value: number | null): void {\r\n    if (value === null) {\r\n      value = 0;\r\n    }\r\n    if (value <= initialRange[0]) {\r\n      // setBallY(size[0] + 10);\r\n      setBallYCurr(size[0]);\r\n    } else if (value > initialRange[1]) {\r\n      // setBallY(map(value, initialRange[0], initialRange[1], size[0], -1));\r\n      setBallYCurr(0);\r\n    }\r\n    else {\r\n      // console.log(value);\r\n      // setBallY(map(value, initialRange[0], initialRange[1], size[0], -1));\r\n      setBallYCurr(map(value, initialRange[0], initialRange[1], size[0], -1));\r\n    }\r\n  }\r\n  const updateCanvasHeight = () => {\r\n    if (canvasRef.current) {\r\n      const rect = canvasRef.current.getBoundingClientRect();\r\n      setCanvasHeight(rect.height);\r\n    }\r\n  };\r\n  useEffect(() => {\r\n\r\n    const canvas = canvasRef.current;\r\n    if (canvas) {\r\n      const ctx = canvas.getContext('2d');\r\n      if (ctx) {\r\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n        drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\r\n\r\n        // ctx.font = '16px Arial';\r\n        // ctx.fillStyle = 'black';\r\n        // // Calculate text position (near top right corner)\r\n        // const textX = canvas.width - 100;\r\n        // const textY = 20;\r\n        // // txt\r\n        // const mappedHeight = map(mouseHeight, 0, 100, initialRange[1], initialRange[0]);\r\n        // ctx.fillText(`pitch: ${mappedHeight.toFixed(2)}`, textX, textY);\r\n\r\n        for (let i = 0 + offset; i < pitchArray.length; i++) {\r\n          const mappedJsonValue = map(pitchArray[i], initialRange[0], initialRange[1], size[0], 0);\r\n          // Set fill color based on condition\r\n          if (colorChangesFull[i]) {\r\n            ctx.fillStyle = closeVoiceColor;\r\n          } else {\r\n            ctx.fillStyle = targetVoiceColor;\r\n          }\r\n\r\n          // Draw a rectangle\r\n          ctx.fillRect(i, mappedJsonValue, rectWidth, rectWidth);\r\n\r\n        }\r\n\r\n\r\n        for (var i = 0; i < ballHistoryFull.length; i++) {\r\n          ctx.beginPath();\r\n          const mappedValue = map(ballHistoryFull[i], initialRange[0], initialRange[1], size[0],-1);\r\n\r\n          ctx.arc(i, mappedValue, 5, 0, 2 * Math.PI);\r\n          ctx.fillStyle = realVoiceColor;\r\n          ctx.fill();\r\n          ctx.closePath();\r\n        }\r\n\r\n        // Plot current value\r\n        ctx.beginPath();\r\n        ctx.arc(currentX * divisor, ballYCurr, 10, 0, 2 * Math.PI);\r\n        ctx.fillStyle = \"black\";\r\n        ctx.fill();\r\n        ctx.closePath();\r\n      }\r\n    }\r\n\r\n  }, [initialRange, pitchArray, ballHistoryFull, showNotes, showNotesPar]);\r\n\r\n\r\n  useEffect(() => {\r\n    const canvas = canvasRef.current;\r\n    if (canvas) {\r\n      const ctx = canvas.getContext('2d');\r\n      if (ctx) {\r\n        // ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n        // drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\r\n\r\n        ctx.font = '16px Arial';\r\n\r\n        ctx.fillStyle = 'black';\r\n        // Calculate text position (near top right corner)\r\n        const textX = canvas.width - 100;\r\n        const textY = 20;\r\n        // txt\r\n        const mappedHeight = map(mouseHeight, 0, 100, initialRange[1], initialRange[0]);\r\n\r\n        const text = `pitch: ${mappedHeight.toFixed(2)}`;\r\n        const metrics = ctx.measureText(text);\r\n        const textWidth = metrics.width;\r\n        const textHeight = 16;\r\n\r\n        const clearX = textX;\r\n        const clearY = textY - textHeight;\r\n        const clearWidth = textWidth;\r\n        const clearHeight = textHeight + 5;\r\n\r\n        ctx.clearRect(clearX, clearY, clearWidth, clearHeight);\r\n\r\n        ctx.fillText(`pitch: ${mappedHeight.toFixed(2)}`, textX, textY);\r\n      }\r\n    }\r\n  }, [mouseHeight])\r\n\r\n  useEffect(() => {\r\n    resetStatesFull();\r\n    setPlayingPause();\r\n    const canvas = canvasRef.current;\r\n    let animationFrameId: number;\r\n\r\n    if (isListen > 1 && canvas) {\r\n      const ctx = canvas.getContext('2d');\r\n      if (ctx) {\r\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n        drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\r\n\r\n        ctx.font = '16px Arial';\r\n        ctx.fillStyle = 'black';\r\n        const textX = canvas.width - 100;\r\n        const textY = 20;\r\n        const mappedHeight = map(mouseHeight, 0, 100, initialRange[1], initialRange[0]);\r\n        ctx.fillText(`pitch: ${mappedHeight.toFixed(2)}`, textX, textY);\r\n\r\n        let drawnUntil = 0;\r\n        let lastFrameTime = Date.now();\r\n\r\n        const draw = () => {\r\n          const now = Date.now();\r\n          const deltaTime = now - lastFrameTime; \r\n          const elementsPerFrame = deltaTime / (1000 / 6) * 135;\r\n          // console.log(elementsPerFrame)\r\n          for (let j = 0; j < elementsPerFrame && drawnUntil < pitchArray.length; j++, drawnUntil++) {\r\n            const i = drawnUntil;\r\n            const mappedJsonValue = map(pitchArray[drawnUntil], initialRange[0], initialRange[1], size[0], 0);\r\n            ctx.fillStyle = closeVoiceColor;\r\n            ctx.fillRect(i, mappedJsonValue, rectWidth + 3, rectWidth + 3);\r\n          }\r\n\r\n          if (drawnUntil < pitchArray.length) {\r\n            lastFrameTime = now; // 更新上一帧的时间\r\n            animationFrameId = requestAnimationFrame(draw);\r\n          } else {\r\n            cancelAnimationFrame(animationFrameId);\r\n          }\r\n        };\r\n\r\n        draw();\r\n\r\n        return () => {\r\n          if (animationFrameId) {\r\n            cancelAnimationFrame(animationFrameId);\r\n          }\r\n        };\r\n      }\r\n    }\r\n  }, [isListen, pitchArray]);\r\n\r\n  useEffect(() => {\r\n    setIsListen(1);\r\n  }, [pitchArray]);\r\n  // retry\r\n  useEffect(() => {\r\n    setPlayingPause();\r\n    // resetStates();\r\n    resetStatesFull();\r\n  }, [isRetry, divisor])\r\n\r\n  // next\r\n  useEffect(() => {\r\n    setPlayingPause();\r\n    // resetStates();\r\n    resetStatesFull();\r\n  }, [playLyricCount])\r\n\r\n  // first\r\n  useEffect(() => {\r\n    setPlayingPause();\r\n    console.log(\"pause\");\r\n    drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\r\n\r\n    // get pitch\r\n    let cleanup: () => void;\r\n\r\n    (async () => {\r\n      cleanup = await getPitch(config, setPitch);\r\n    })();\r\n\r\n    return () => {\r\n      cleanup && cleanup();\r\n    };\r\n  }, []);\r\n  // first \r\n  useEffect(() => {\r\n    console.log(showNotesPar);\r\n    let cleanup: () => void;\r\n    // Set the Canvas height when mounting the component for the first time\r\n    updateCanvasHeight();\r\n\r\n    // Set up resize event listener\r\n    window.addEventListener('resize', updateCanvasHeight);\r\n\r\n    return () => {\r\n      cleanup && cleanup();\r\n      window.removeEventListener('resize', updateCanvasHeight);\r\n    };\r\n  }, []);\r\n  useEffect(() => {\r\n    if (canvasRef.current) {\r\n      const rect = canvasRef.current.getBoundingClientRect();\r\n      setCanvasHeight(rect.height);\r\n    }\r\n  }, []);\r\n  useEffect(() => {\r\n    let url = '';\r\n    if (gender === 'male') {\r\n      url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/list.json';\r\n    }\r\n    else {\r\n      url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/list.json';\r\n    }\r\n\r\n    console.log(url);\r\n    console.log('playlyriccount', playLyricCount);\r\n    if (jsonFiles.length > playLyricCount) {\r\n      // Get the correct filename based on playLyricCount\r\n      const filename = jsonFiles[playLyricCount];\r\n\r\n      // fetch(`http://127.0.0.1:8000/data/${syllableCount}/${gender}/${filename}`)\r\n\r\n      if (gender === 'male') {\r\n        url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/' + filename;\r\n      }\r\n      else {\r\n        url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/' + filename;\r\n      }\r\n      console.log('file url --------------->', url);\r\n      fetch(url)\r\n        .then(response => {\r\n          if (!response.ok) {\r\n            throw new Error('Network response was not ok');\r\n          }\r\n          return response.json();\r\n        })\r\n        .then(data => {\r\n          const pitches = generatePitchArrayFromJson(data.data);\r\n          setPitchArray(pitches);\r\n        })\r\n        .catch(error => {\r\n          console.error('Error fetching the JSON file:', error);\r\n        });\r\n    }\r\n  }, [playLyricCount, jsonFiles]);\r\n\r\n  useEffect(() => {\r\n    let url = '';\r\n    if (gender === 'male') {\r\n      url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/list.json';\r\n    }\r\n    else {\r\n      url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/list.json';\r\n    }\r\n    // const url = `https://ceas5.uc.edu/transvoice/jsonDataOm/${gender}/${genderName}/${syllableCount}syllable/list.json`;\r\n\r\n    fetch(url)\r\n      .then(response => {\r\n        if (!response.ok) {\r\n          throw new Error('Network response was not ok');\r\n        }\r\n        return response.json();\r\n      })\r\n      .then(data => {\r\n        console.log(data.base_filenames); // Print base file name\r\n        setJsonFiles(data.json_files);\r\n\r\n        const modifiedArray = data.base_filenames.map((element: any) => element.replaceAll('_', ' ')); // replace all occurrences of underscore\r\n        setMaxLyricCount(data.base_filenames.length - 1);\r\n        setBaseFilenames(modifiedArray);\r\n\r\n        // Check if there is a file name\r\n        if (data.base_filenames.length > 0) {\r\n          // Get the contents of the first file\r\n          let url = '';\r\n          if (gender === 'male') {\r\n            url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/' + data.json_files[0];\r\n          }\r\n          else {\r\n            url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/' + data.json_files[0];\r\n          }\r\n\r\n          return fetch(url);\r\n        } else {\r\n          throw new Error('No files available');\r\n        }\r\n      })\r\n      .then(response => {\r\n        if (!response.ok) {\r\n          throw new Error('Network response was not ok');\r\n        }\r\n        return response.json();\r\n      })\r\n      .then(firstFileData => {\r\n        console.log(firstFileData); // Print the contents of the first file\r\n        const pitches = generatePitchArrayFromJson(firstFileData.data);\r\n        // console.log(pitches);\r\n        setPitchArray(pitches);\r\n      })\r\n      .catch(error => {\r\n        console.error('Error:', error);\r\n      });\r\n\r\n    onPlayLyricCountChange(0);\r\n\r\n  }, [gender, genderName, syllableCount]);\r\n\r\n  useEffect(() => {\r\n\r\n    if (jsonFiles.length > 0) {\r\n      // Construct the URL of the audio file\r\n      // const audioFilename = `${gender}-${jsonFiles[0]}.wav`;\r\n      let audioFilename = '';\r\n      let audioUrl = '';\r\n      if (gender === 'male') {\r\n        audioFilename = `${gender}-${jsonFiles[playLyricCount].replace('.json', '')}.wav`;\r\n        audioUrl = `https://ceas5.uc.edu/transvoice/audio/${syllableCount}/${gender}/${audioFilename}`;\r\n      }\r\n      else {\r\n        audioFilename = `${genderName}-${gender}-${jsonFiles[playLyricCount].replace('.json', '')}.wav`;\r\n        audioUrl = `https://ceas5.uc.edu/transvoice/audioOm/${gender}/${genderName}/${syllableCount}syllable/${audioFilename}`;\r\n      }\r\n      setAudioSrc(audioUrl);\r\n    }\r\n  }, [syllableCount, gender, playLyricCount, jsonFiles]);\r\n\r\n  useEffect(() => {\r\n    onAudioSrcChange(audioSrc);\r\n  }, [audioSrc, onAudioSrcChange]);\r\n\r\n  // Change note function\r\n  const toggleShowNotes = () => {\r\n    setShowNotes(!showNotes);\r\n    const canvas = canvasRef.current;\r\n    if (canvas && canvas.getContext) {\r\n      const ctx = canvas.getContext('2d');\r\n      if (ctx) {\r\n        ctx.clearRect(0, 0, canvas.width / 24, canvas.height);\r\n        drawBackground(canvasRef, initialRange[1], initialRange[0], !showNotes);\r\n      }\r\n    }\r\n  }\r\n\r\n  // Redraw the background\r\n  useEffect(() => {\r\n    drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes); // Make sure the background is redrawn on state change\r\n  }, [showNotes]);\r\n\r\n  const updateBallHistoryFull = (pitch: number) => {\r\n    let tempHistoryFull = [...ballHistoryFull];\r\n    let ctxdiv = currentX * divisor;\r\n    \r\n    let ballYtem = map(pitch, initialRange[0], initialRange[1], size[0], -1)\r\n    if (currentX < desiredLength - 1) {\r\n      setShouldDisabled(false);\r\n      tempHistoryFull[ctxdiv] = pitch;\r\n      setColorChangesFull(currentColors => {\r\n        const newColors = [...currentColors];\r\n        const mappedJsonValue = map(pitchArray[ctxdiv], initialRange[0], initialRange[1], size[0], 0);\r\n        const difference = Math.abs(mappedJsonValue - ballYtem);\r\n        if (difference <= 50 && !isNaN(difference)) {\r\n          for (let j = ctxdiv - divisor; j <= ctxdiv + divisor && j < CanvasLength; j++) {\r\n            newColors[j] = true;\r\n          }\r\n        }\r\n        return newColors;\r\n      });\r\n\r\n    } else {\r\n      setShouldDisabled(true);\r\n      if (!shouldDisabled) {\r\n        setPlayingPause();\r\n      }\r\n    }\r\n    setCurrentX(currentX + 1);\r\n    setBallHistoryFull(tempHistoryFull);\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (isPlaying) {\r\n      updateBallY(pitch);\r\n    }\r\n\r\n  }, [pitch]);\r\n\r\n  useEffect(() => {\r\n    if (isPlaying) {\r\n      // updateBallHistoryFull(pitch);\r\n      if (pitch !== null) {\r\n        updateBallHistoryFull(pitch);\r\n    } else {\r\n        updateBallHistoryFull(0);\r\n    }\r\n    }\r\n  }, [pitch, isPlaying]);\r\n\r\n\r\n\r\n  useEffect(() => {\r\n    if (shouldDisabled && isPlaying) {\r\n      resetStatesFull();\r\n\r\n      setShouldDisabled(false);\r\n    }\r\n  }, [isPlaying]);\r\n\r\n  // Adjust notes\r\n  useEffect(() => {\r\n    console.log(showNotesPar);\r\n    setShowNotes(showNotesPar);\r\n    const canvas = canvasRef.current;\r\n    if (canvas && canvas.getContext) {\r\n      const ctx = canvas.getContext('2d');\r\n      if (ctx) {\r\n        ctx.clearRect(0, 0, canvas.width / 24, canvas.height);\r\n        drawBackground(canvasRef, initialRange[1], initialRange[0], !showNotes);\r\n      }\r\n    }\r\n  }, [showNotesPar]);\r\n\r\n\r\n  return (\r\n    <Row style={{ maxHeight: \"27vw\", maxWidth: \"100vw\" }}>\r\n      {/* <div className=\"color-block\"> */}\r\n      <Col span={1}>\r\n      </Col>\r\n      <Col span={22}>\r\n        <div style={{ position: 'relative', height: canvasHeight }}>\r\n        <div\r\n                    className=\"blueAxis\"\r\n                    style={{\r\n                        height: canvasHeight,\r\n                    }}\r\n                >\r\n            {showNotes ? 'Pitch / (Note)' : 'Pitch / (Hz)'}\r\n          </div>\r\n          <canvas onMouseMove={handleMouseMove} ref={canvasRef} onClick={toggleShowNotes} id=\"pitchCanvas\" width={size[1]} height={size[0]} style={{ border: '1px solid #000' }}></canvas>\r\n          <div\r\n            style={{\r\n              position: 'absolute',\r\n              top: canvasHeight,\r\n              left: 0,\r\n              // right: 0,\r\n              width: canvasHeight * 3.5,\r\n              display: 'flex',\r\n              justifyContent: 'space-between',\r\n              fontSize: '12px',\r\n              marginLeft: '3vw',\r\n            }}\r\n          >\r\n            \r\n            {[...Array(11)].map((_, index) => (\r\n  <span key={index}>\r\n    {((15 / (divisor / 4)) * (index / 10)).toFixed(1)}s\r\n  </span>\r\n))}\r\n          </div>\r\n        </div>\r\n\r\n\r\n      </Col>\r\n      <Col span={1}>\r\n        {/* {timeInterval} */}\r\n      </Col>\r\n    </Row>\r\n  );\r\n}\r\n\r\nexport default Fixed;"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}