{"ast":null,"code":"var _jsxFileName = \"D:\\\\Project\\\\UC_Trains_Voice\\\\react-demo\\\\src\\\\Canvas\\\\Fixed.tsx\",\n  _s = $RefreshSig$();\nimport React, { useEffect, useState } from 'react';\nimport { map, drawBackground } from '../function/canvasDefault';\nimport { getPitch } from '../function/getPitch';\nimport { Col, Row } from 'antd';\nimport { useCanvasHooks } from '../hooks/useCanvasHooks'; // variables and functions\n\nimport useCanvasChangeHzAndNotes from '../hooksUseEffect/useCanvasChangeHzAndNotes';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nconst Fixed = ({\n  setMaxLyricCount,\n  setIsListen,\n  isListen,\n  initialRange,\n  divisor,\n  isRetry,\n  setPlayingPause,\n  gender,\n  genderName,\n  onAudioSrcChange,\n  setBaseFilenames,\n  syllableCount,\n  onPlayLyricCountChange,\n  config,\n  COLORS,\n  size,\n  playLyricCount,\n  isPlaying,\n  showNotesPar\n}) => {\n  _s();\n  var _notesLabel$map, _freqLabel$map, _freqLabel$map2;\n  const {\n    pitch,\n    setPitch,\n    mouseHeight,\n    setMouseHeight,\n    realVoiceColor,\n    targetVoiceColor,\n    closeVoiceColor,\n    ballYCurr,\n    setBallYCurr,\n    canvasRef,\n    rectWidth,\n    CanvasLength,\n    canvasHeight,\n    setCanvasHeight,\n    showNotes,\n    setShowNotes,\n    offset,\n    currentX,\n    setCurrentX,\n    initialcurrentX,\n    notesLabel,\n    setNotesLabel,\n    freqLabel,\n    setFreqLabel,\n    updateBallY,\n    updateCanvasHeight,\n    handleMouseMove\n  } = useCanvasHooks(size, divisor, COLORS, initialRange);\n\n  // const [pitch, setPitch] = useState<number | null>(null);\n  // const { realVoiceColor, targetVoiceColor, closeVoiceColor } = COLORS;\n  // const [mouseHeight, setMouseHeight] = useState<number>(0);\n  const [shouldDisabled, setShouldDisabled] = useState(false);\n  // const [ballYCurr, setBallYCurr] = useState<number>(size[0]);\n  // const canvasRef = useRef<HTMLCanvasElement>(null);\n  // const rectWidth = 5;\n  const spedinter = 5;\n  const divisorLocal = 4;\n  // const offset = 20;\n  const desiredLength = Math.floor(size[1] / divisor);\n  // const desiredLengthBall = Math.floor(size[1] / 5 / 4);\n\n  // const CanvasLength = size[1]; // 1400\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 initialcurrentX = 0;\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: React.MouseEvent<HTMLCanvasElement>) => {\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\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\n  // function updateBallY(value: number | null): void {\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  //   }\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    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\n  // change Notes and hz display\n  useCanvasChangeHzAndNotes(setShowNotes, showNotes, showNotesPar, canvasRef, initialRange, setNotesLabel, setFreqLabel, canvasHeight);\n  return /*#__PURE__*/_jsxDEV(Row, {\n    style: {\n      maxHeight: \"27vw\",\n      marginBottom: \"3vw\",\n      maxWidth: \"100vw\"\n    },\n    children: [/*#__PURE__*/_jsxDEV(Col, {\n      span: 1\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 638,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(Col, {\n      span: 22,\n      children: [/*#__PURE__*/_jsxDEV(\"div\", {\n        className: \"yAxisArea\",\n        style: {\n          height: canvasHeight\n        },\n        children: /*#__PURE__*/_jsxDEV(Row, {\n          style: {\n            height: canvasHeight\n          },\n          children: [/*#__PURE__*/_jsxDEV(Col, {\n            span: 8,\n            children: showNotesPar ? /*#__PURE__*/_jsxDEV(\"div\", {\n              style: {\n                height: canvasHeight\n              },\n              className: \"yAxisLabel\",\n              children: \"Pitch (Notes)\"\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 645,\n              columnNumber: 39\n            }, this) : /*#__PURE__*/_jsxDEV(\"div\", {\n              style: {\n                height: canvasHeight\n              },\n              className: \"yAxisLabel\",\n              children: \"Pitch (Hz)\"\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 646,\n              columnNumber: 39\n            }, this)\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 643,\n            columnNumber: 13\n          }, this), /*#__PURE__*/_jsxDEV(Col, {\n            span: 8,\n            children: /*#__PURE__*/_jsxDEV(\"div\", {\n              className: \"yAxisNumbers\",\n              style: {\n                height: canvasHeight * 1.039\n              },\n              children: showNotesPar ? (_notesLabel$map = notesLabel === null || notesLabel === void 0 ? void 0 : notesLabel.map((note, index) => /*#__PURE__*/_jsxDEV(\"div\", {\n                children: note\n              }, index, false, {\n                fileName: _jsxFileName,\n                lineNumber: 651,\n                columnNumber: 54\n              }, this))) !== null && _notesLabel$map !== void 0 ? _notesLabel$map : [] : (_freqLabel$map = freqLabel === null || freqLabel === void 0 ? void 0 : freqLabel.map((freq, index) => /*#__PURE__*/_jsxDEV(\"div\", {\n                children: freq\n              }, index, false, {\n                fileName: _jsxFileName,\n                lineNumber: 652,\n                columnNumber: 53\n              }, this))) !== null && _freqLabel$map !== void 0 ? _freqLabel$map : []\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 649,\n              columnNumber: 15\n            }, this)\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 648,\n            columnNumber: 13\n          }, this), /*#__PURE__*/_jsxDEV(Col, {\n            span: 8,\n            children: /*#__PURE__*/_jsxDEV(\"div\", {\n              className: \"yAxisLines\",\n              style: {\n                height: canvasHeight\n              },\n              children: (_freqLabel$map2 = freqLabel === null || freqLabel === void 0 ? void 0 : freqLabel.map((_, index) => /*#__PURE__*/_jsxDEV(\"div\", {}, void 0, false, {\n                fileName: _jsxFileName,\n                lineNumber: 658,\n                columnNumber: 19\n              }, this))) !== null && _freqLabel$map2 !== void 0 ? _freqLabel$map2 : []\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 656,\n              columnNumber: 15\n            }, this)\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 655,\n            columnNumber: 13\n          }, this)]\n        }, void 0, true, {\n          fileName: _jsxFileName,\n          lineNumber: 642,\n          columnNumber: 11\n        }, this)\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 641,\n        columnNumber: 7\n      }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n        style: {\n          height: canvasHeight\n        },\n        children: [/*#__PURE__*/_jsxDEV(\"canvas\", {\n          ref: canvasRef,\n          onMouseMove: handleMouseMove,\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: 666,\n          columnNumber: 11\n        }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n          style: {\n            position: 'absolute',\n            top: canvasHeight,\n            left: 0,\n            width: canvasHeight * 3.486,\n            display: 'flex',\n            justifyContent: 'space-between',\n            fontSize: '12px',\n            marginLeft: '3vw',\n            height: '25px'\n          },\n          children: [...Array(11)].map((_, index) => /*#__PURE__*/_jsxDEV(\"div\", {\n            style: {\n              position: 'relative'\n            },\n            children: [/*#__PURE__*/_jsxDEV(\"div\", {\n              className: \"timeMarkerLine\"\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 689,\n              columnNumber: 17\n            }, this), /*#__PURE__*/_jsxDEV(\"span\", {\n              className: \"timeMarkerNum\",\n              children: (15 / (divisor / 4) * (index / 10)).toFixed(1)\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 690,\n              columnNumber: 17\n            }, this)]\n          }, index, true, {\n            fileName: _jsxFileName,\n            lineNumber: 688,\n            columnNumber: 15\n          }, this))\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 674,\n          columnNumber: 11\n        }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n          style: {\n            position: 'absolute',\n            top: canvasHeight * 1.12,\n            left: 0,\n            width: canvasHeight * 3.486,\n            display: 'flex',\n            justifyContent: 'center',\n            marginLeft: '3vw',\n            height: '50px'\n          },\n          className: \"XAxis\",\n          children: /*#__PURE__*/_jsxDEV(\"div\", {\n            children: \"Time (Seconds)\"\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 709,\n            columnNumber: 13\n          }, this)\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 696,\n          columnNumber: 11\n        }, this)]\n      }, void 0, true, {\n        fileName: _jsxFileName,\n        lineNumber: 665,\n        columnNumber: 9\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 640,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(Col, {\n      span: 1\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 747,\n      columnNumber: 7\n    }, this)]\n  }, void 0, true, {\n    fileName: _jsxFileName,\n    lineNumber: 636,\n    columnNumber: 5\n  }, this);\n};\n_s(Fixed, \"x9pHHKHre9eVN6QqWatM/ulQDNg=\", false, function () {\n  return [useCanvasHooks, useCanvasChangeHzAndNotes];\n});\n_c = Fixed;\nexport default Fixed;\nvar _c;\n$RefreshReg$(_c, \"Fixed\");","map":{"version":3,"names":["React","useEffect","useState","map","drawBackground","getPitch","Col","Row","useCanvasHooks","useCanvasChangeHzAndNotes","jsxDEV","_jsxDEV","Fixed","setMaxLyricCount","setIsListen","isListen","initialRange","divisor","isRetry","setPlayingPause","gender","genderName","onAudioSrcChange","setBaseFilenames","syllableCount","onPlayLyricCountChange","config","COLORS","size","playLyricCount","isPlaying","showNotesPar","_s","_notesLabel$map","_freqLabel$map","_freqLabel$map2","pitch","setPitch","mouseHeight","setMouseHeight","realVoiceColor","targetVoiceColor","closeVoiceColor","ballYCurr","setBallYCurr","canvasRef","rectWidth","CanvasLength","canvasHeight","setCanvasHeight","showNotes","setShowNotes","offset","currentX","setCurrentX","initialcurrentX","notesLabel","setNotesLabel","freqLabel","setFreqLabel","updateBallY","updateCanvasHeight","handleMouseMove","shouldDisabled","setShouldDisabled","spedinter","divisorLocal","desiredLength","Math","floor","initialColorChangesFull","Array","fill","initialBallHistoryFull","NaN","colorChangesFull","setColorChangesFull","ballHistoryFull","setBallHistoryFull","resetStatesFull","pitchArray","setPitchArray","jsonFiles","setJsonFiles","audioSrc","setAudioSrc","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","canvas","current","ctx","getContext","clearRect","width","height","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","rect","getBoundingClientRect","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","style","maxHeight","marginBottom","maxWidth","children","span","fileName","_jsxFileName","lineNumber","columnNumber","className","note","index","freq","_","ref","onMouseMove","id","border","position","top","left","display","justifyContent","fontSize","marginLeft","_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 { CONFIG, COLORS } from '../types/configTypes';\r\n\r\n\r\nimport { useCanvasHooks } from '../hooks/useCanvasHooks'; // variables and functions\r\nimport { useTemString } from '../hooks/useTemString';\r\n\r\nimport useCanvasMouseText from '../hooksUseEffect/useCanvasMouseText';\r\nimport useCanvasRetry from '../hooksUseEffect/useCanvasRetry';\r\nimport useCanvasUpdatePitch from '../hooksUseEffect/useCanvasUpdatePitch';\r\nimport useCanvasAdjustHeight from '../hooksUseEffect/useCanvasAdjustHeight';\r\nimport useCanvasInitializeGetPitch from '../hooksUseEffect/useCanvasInitializeGetPitch';\r\nimport useCanvasChangeHzAndNotes from '../hooksUseEffect/useCanvasChangeHzAndNotes';\r\nimport useCanvasRedrawBackground from '../hooksUseEffect/useCanvasRedrawBackground';\r\n\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  playLyricCount: number;\r\n  gender: string;\r\n  syllableCount: string;\r\n  genderName: string;\r\n  onPlayLyricCountChange: (newCount: number) => void;\r\n  setBaseFilenames: (filenames: string[]) => void;\r\n  onAudioSrcChange: (newAudioSrc: string) => 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}\r\n\r\nconst Fixed: React.FC<FixedProps> = ({\r\n  setMaxLyricCount,\r\n  setIsListen,\r\n  isListen,\r\n  initialRange,\r\n  divisor,\r\n  isRetry,\r\n  setPlayingPause,\r\n  gender,\r\n  genderName,\r\n  onAudioSrcChange,\r\n  setBaseFilenames,\r\n  syllableCount,\r\n  onPlayLyricCountChange,\r\n  config,\r\n  COLORS,\r\n  size,\r\n  playLyricCount,\r\n  isPlaying,\r\n  showNotesPar }) => {\r\n  const {\r\n    pitch,\r\n    setPitch,\r\n    mouseHeight,\r\n    setMouseHeight,\r\n    realVoiceColor,\r\n    targetVoiceColor,\r\n    closeVoiceColor,\r\n    ballYCurr,\r\n    setBallYCurr,\r\n    canvasRef,\r\n    rectWidth,\r\n    CanvasLength,\r\n    canvasHeight,\r\n    setCanvasHeight,\r\n    showNotes,\r\n    setShowNotes,\r\n    offset,\r\n    currentX,\r\n    setCurrentX,\r\n    initialcurrentX,\r\n    notesLabel,\r\n    setNotesLabel,\r\n    freqLabel,\r\n    setFreqLabel,\r\n\r\n    updateBallY,\r\n    updateCanvasHeight,\r\n    handleMouseMove,\r\n  } = useCanvasHooks(size, divisor, COLORS, initialRange);\r\n\r\n  // const [pitch, setPitch] = useState<number | null>(null);\r\n  // const { realVoiceColor, targetVoiceColor, closeVoiceColor } = COLORS;\r\n  // const [mouseHeight, setMouseHeight] = useState<number>(0);\r\n  const [shouldDisabled, setShouldDisabled] = useState<boolean>(false);\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 offset = 20;\r\n  const desiredLength = Math.floor(size[1] / divisor);\r\n  // const desiredLengthBall = Math.floor(size[1] / 5 / 4);\r\n\r\n  // const CanvasLength = size[1]; // 1400\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 initialcurrentX = 0;\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    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    // change Notes and hz display\r\n    useCanvasChangeHzAndNotes(setShowNotes, showNotes, showNotesPar, canvasRef, initialRange, setNotesLabel, setFreqLabel, canvasHeight);\r\n\r\n  return (\r\n    <Row style={{ maxHeight: \"27vw\", marginBottom: \"3vw\",maxWidth: \"100vw\" }}>\r\n      {/* <div className=\"color-block\"> */}\r\n      <Col span={1}>\r\n      </Col>\r\n      <Col span={22}>\r\n      <div className=\"yAxisArea\" style={{ height: canvasHeight }}>\r\n          <Row style={{ height: canvasHeight }}>\r\n            <Col span={8}>\r\n            {showNotesPar\r\n                                    ? <div style={{ height: canvasHeight }} className=\"yAxisLabel\">Pitch (Notes)</div>\r\n                                    : <div style={{ height: canvasHeight }} className=\"yAxisLabel\">Pitch (Hz)</div>}\r\n            </Col>\r\n            <Col span={8}>\r\n              <div className=\"yAxisNumbers\" style={{ height: canvasHeight * 1.039 }}>\r\n                {showNotesPar\r\n                  ? notesLabel?.map((note, index) => <div key={index}>{note}</div>) ?? []\r\n                  : freqLabel?.map((freq, index) => <div key={index}>{freq}</div>) ?? []}\r\n              </div>\r\n            </Col>\r\n            <Col span={8}>\r\n              <div className=\"yAxisLines\" style={{ height: canvasHeight }}>\r\n                {freqLabel?.map((_, index) => (\r\n                  <div></div>\r\n                )) ?? []}\r\n              </div>\r\n            </Col>\r\n          </Row>\r\n        </div>\r\n        \r\n        <div style={{ height: canvasHeight }}>\r\n          <canvas\r\n            ref={canvasRef}\r\n            onMouseMove={handleMouseMove}\r\n            id=\"pitchCanvas\"\r\n            width={size[1]}\r\n            height={size[0]}\r\n            style={{ border: '1px solid #000' }}\r\n          ></canvas>\r\n          <div\r\n            style={{\r\n              position: 'absolute',\r\n              top: canvasHeight,\r\n              left: 0,\r\n              width: canvasHeight * 3.486,\r\n              display: 'flex',\r\n              justifyContent: 'space-between',\r\n              fontSize: '12px',\r\n              marginLeft: '3vw',\r\n              height: '25px',\r\n            }}\r\n          >\r\n            {[...Array(11)].map((_, index) => (\r\n              <div key={index} style={{ position: 'relative' }}>\r\n                <div className=\"timeMarkerLine\" />\r\n                <span className='timeMarkerNum'>\r\n                {((15 / (divisor / 4)) * (index / 10)).toFixed(1)}\r\n                </span>\r\n              </div>\r\n            ))}\r\n          </div>\r\n          <div\r\n            style={{\r\n              position: 'absolute',\r\n              top: canvasHeight * (1.12),\r\n              left: 0,\r\n              width: canvasHeight * 3.486,\r\n              display: 'flex',\r\n              justifyContent: 'center',\r\n              marginLeft: '3vw',\r\n              height: '50px',\r\n            }}\r\n            className='XAxis'\r\n          >\r\n            <div>Time (Seconds)</div>\r\n\r\n          </div>\r\n\r\n        </div>\r\n\r\n\r\n        {/* <div style={{ position: 'relative', height: canvasHeight }}>\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.486,\r\n              display: 'flex',\r\n              justifyContent: 'space-between',\r\n              fontSize: '12px',\r\n              marginLeft: '3vw',\r\n              height: '25px',\r\n\r\n            }}\r\n          >\r\n\r\n            {[...Array(11)].map((_, index) => (\r\n              <div key={index} style={{ position: 'relative' }}>\r\n                <div className=\"timeMarkerLine\" />\r\n                <span className='timeMarkerNum'>\r\n                  {((15 / (divisor / 4)) * (index / 10)).toFixed(1)}\r\n                </span>\r\n              </div>\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":[]}