{"ast":null,"code":"var _jsxFileName = \"/var/www/gavt/src/Canvas/Fixed.tsx\",\n  _s = $RefreshSig$();\nimport React, { useEffect, useState } from 'react';\nimport { map, drawBackground } from '../function/canvasDefault';\nimport { Col, Row } from 'antd';\nimport { useCanvasHooks } from '../hooks/useCanvasHooks'; // variables and functions\n\nimport useCanvasMouseText from '../hooksUseEffect/useCanvasMouseText';\nimport useCanvasRetry from '../hooksUseEffect/useCanvasRetry';\nimport useCanvasUpdatePitch from '../hooksUseEffect/useCanvasUpdatePitch';\nimport useCanvasAdjustHeight from '../hooksUseEffect/useCanvasAdjustHeight';\nimport useCanvasInitializeGetPitch from '../hooksUseEffect/useCanvasInitializeGetPitch';\nimport useCanvasChangeHzAndNotes from '../hooksUseEffect/useCanvasChangeHzAndNotes';\nimport useCanvasRedrawBackground from '../hooksUseEffect/useCanvasRedrawBackground';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nconst divisorLocal = 4;\nfunction 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}\nfunction 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}\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    realVoiceColor,\n    targetVoiceColor,\n    closeVoiceColor,\n    ballYCurr,\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  const [shouldDisabled, setShouldDisabled] = useState(false);\n  const desiredLength = Math.floor(size[1] / divisor);\n  const initialColorChangesFull = new Array(CanvasLength).fill(false);\n  const initialBallHistoryFull = new Array(CanvasLength).fill(NaN);\n  const [colorChangesFull, setColorChangesFull] = useState(initialColorChangesFull);\n  const [ballHistoryFull, setBallHistoryFull] = useState(initialBallHistoryFull);\n  const resetStatesFull = () => {\n    setColorChangesFull([...initialColorChangesFull]);\n    setBallHistoryFull([...initialBallHistoryFull]);\n    setCurrentX(initialcurrentX);\n  };\n  const [pitchArray, setPitchArray] = useState([]);\n  const [jsonFiles, setJsonFiles] = useState([]);\n  const [audioSrc, setAudioSrc] = useState('');\n\n  // +++++++++++++++++++++++++++++++++++++++++++++++++\n  // Hooks useEffect parts \\\\\n\n  // initialize get pitch function + pause + draw background\n  useCanvasInitializeGetPitch(config, setPitch, updateCanvasHeight, setPlayingPause, canvasRef, initialRange, showNotes);\n\n  // set canvas size for different resolutions\n  useCanvasAdjustHeight(canvasRef, setCanvasHeight);\n\n  // store current pitch\n  useCanvasUpdatePitch(isPlaying, pitch, updateBallY);\n\n  // update mouse text\n  useCanvasMouseText(canvasRef, mouseHeight, initialRange);\n\n  // change Notes and hz display\n  useCanvasChangeHzAndNotes(setShowNotes, showNotes, showNotesPar, canvasRef, initialRange, setNotesLabel, setFreqLabel, canvasHeight);\n\n  // retry\n  useCanvasRetry(isRetry, divisor, setPlayingPause, resetStatesFull);\n\n  // redraw background when hz or notes changed\n  useCanvasRedrawBackground(canvasRef, showNotesPar, initialRange);\n\n  // +++++++++++++++++++++++++++++++++++++++++++++++++\n  // Unique useEffect parts \\\\\n\n  // render user curve\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        const textX = canvas.width - 100;\n        const textY = 20;\n        ctx.clearRect(0, 0, textX - 5, canvas.height);\n        ctx.clearRect(0, textY + 5, canvas.width, canvas.height - (textY + 5));\n        drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\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  }, [COLORS, initialRange, pitchArray, ballHistoryFull, showNotes, showNotesPar]);\n\n  // render listen curve\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        const textX = canvas.width - 100;\n        const textY = 20;\n        ctx.clearRect(0, 0, textX - 5, canvas.height);\n        ctx.clearRect(0, textY + 5, canvas.width, canvas.height - (textY + 5));\n        drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\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          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\n  // next\n  useEffect(() => {\n    setPlayingPause();\n    resetStatesFull();\n  }, [playLyricCount]);\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    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      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      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      const pitches = generatePitchArrayFromJson(firstFileData.data);\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  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      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  return /*#__PURE__*/_jsxDEV(Row, {\n    style: {\n      maxHeight: \"27vw\",\n      marginBottom: \"5vw\",\n      maxWidth: \"100vw\"\n    },\n    children: [/*#__PURE__*/_jsxDEV(Col, {\n      span: 1\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 471,\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: 478,\n              columnNumber: 19\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: 479,\n              columnNumber: 19\n            }, this)\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 476,\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: 484,\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: 485,\n                columnNumber: 53\n              }, this))) !== null && _freqLabel$map !== void 0 ? _freqLabel$map : []\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 482,\n              columnNumber: 15\n            }, this)\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 481,\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: 491,\n                columnNumber: 19\n              }, this))) !== null && _freqLabel$map2 !== void 0 ? _freqLabel$map2 : []\n            }, void 0, false, {\n              fileName: _jsxFileName,\n              lineNumber: 489,\n              columnNumber: 15\n            }, this)\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 488,\n            columnNumber: 13\n          }, this)]\n        }, void 0, true, {\n          fileName: _jsxFileName,\n          lineNumber: 475,\n          columnNumber: 11\n        }, this)\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 474,\n        columnNumber: 9\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: 499,\n          columnNumber: 11\n        }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n          className: \"XAxisNum\",\n          style: {\n            top: canvasHeight,\n            width: canvasHeight * 3.486\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: 517,\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: 518,\n              columnNumber: 17\n            }, this)]\n          }, index, true, {\n            fileName: _jsxFileName,\n            lineNumber: 516,\n            columnNumber: 15\n          }, this))\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 507,\n          columnNumber: 11\n        }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n          style: {\n            top: canvasHeight * 1.12,\n            width: canvasHeight * 3.486\n          },\n          className: \"XAxis\",\n          children: /*#__PURE__*/_jsxDEV(\"div\", {\n            children: \"Time (Seconds)\"\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 531,\n            columnNumber: 13\n          }, this)\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 524,\n          columnNumber: 11\n        }, this)]\n      }, void 0, true, {\n        fileName: _jsxFileName,\n        lineNumber: 498,\n        columnNumber: 9\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 473,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(Col, {\n      span: 1\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 538,\n      columnNumber: 7\n    }, this)]\n  }, void 0, true, {\n    fileName: _jsxFileName,\n    lineNumber: 470,\n    columnNumber: 5\n  }, this);\n};\n_s(Fixed, \"1FN6ZfaTvF6/9RtHYsJijEEi1Bw=\", false, function () {\n  return [useCanvasHooks, useCanvasInitializeGetPitch, useCanvasAdjustHeight, useCanvasUpdatePitch, useCanvasMouseText, useCanvasChangeHzAndNotes, useCanvasRetry, useCanvasRedrawBackground];\n});\n_c = Fixed;\nexport default Fixed;\nvar _c;\n$RefreshReg$(_c, \"Fixed\");","map":{"version":3,"names":["React","useEffect","useState","map","drawBackground","Col","Row","useCanvasHooks","useCanvasMouseText","useCanvasRetry","useCanvasUpdatePitch","useCanvasAdjustHeight","useCanvasInitializeGetPitch","useCanvasChangeHzAndNotes","useCanvasRedrawBackground","jsxDEV","_jsxDEV","divisorLocal","parseTimeToSeconds","timeString","parts","split","hours","parseInt","minutes","seconds","frames","frameDurationInSeconds","generatePitchArrayFromJson","jsonData","pitchArray","newdArray","data","previousTimeInSeconds","previousPitch","i","length","currentTimeInSeconds","time","timeDifference","j","push","pitch","endTimeInSeconds","endTimeDifference","extendedArray","forEach","pop","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","setPitch","mouseHeight","realVoiceColor","targetVoiceColor","closeVoiceColor","ballYCurr","canvasRef","rectWidth","CanvasLength","canvasHeight","setCanvasHeight","showNotes","setShowNotes","offset","currentX","setCurrentX","initialcurrentX","notesLabel","setNotesLabel","freqLabel","setFreqLabel","updateBallY","updateCanvasHeight","handleMouseMove","shouldDisabled","setShouldDisabled","desiredLength","Math","floor","initialColorChangesFull","Array","fill","initialBallHistoryFull","NaN","colorChangesFull","setColorChangesFull","ballHistoryFull","setBallHistoryFull","resetStatesFull","setPitchArray","jsonFiles","setJsonFiles","audioSrc","setAudioSrc","canvas","current","ctx","getContext","textX","width","textY","clearRect","height","mappedJsonValue","fillStyle","fillRect","beginPath","mappedValue","arc","PI","closePath","animationFrameId","drawnUntil","lastFrameTime","Date","now","draw","deltaTime","elementsPerFrame","requestAnimationFrame","cancelAnimationFrame","url","filename","fetch","then","response","ok","Error","json","pitches","catch","error","console","json_files","modifiedArray","base_filenames","element","replaceAll","firstFileData","audioFilename","audioUrl","replace","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","top","position","toFixed","_c","$RefreshReg$"],"sources":["/var/www/gavt/src/Canvas/Fixed.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { map, drawBackground } from '../function/canvasDefault';\nimport { Col, Row } from 'antd';\nimport { CONFIG, COLORS } from '../types/configTypes';\n\n\nimport { useCanvasHooks } from '../hooks/useCanvasHooks'; // variables and functions\n\nimport useCanvasMouseText from '../hooksUseEffect/useCanvasMouseText';\nimport useCanvasRetry from '../hooksUseEffect/useCanvasRetry';\nimport useCanvasUpdatePitch from '../hooksUseEffect/useCanvasUpdatePitch';\nimport useCanvasAdjustHeight from '../hooksUseEffect/useCanvasAdjustHeight';\nimport useCanvasInitializeGetPitch from '../hooksUseEffect/useCanvasInitializeGetPitch';\nimport useCanvasChangeHzAndNotes from '../hooksUseEffect/useCanvasChangeHzAndNotes';\nimport useCanvasRedrawBackground from '../hooksUseEffect/useCanvasRedrawBackground';\n\nconst divisorLocal = 4;\n\nfunction parseTimeToSeconds(timeString: string): number {\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\n  return hours * 3600 + minutes * 60 + seconds + frameDurationInSeconds;\n}\n\nfunction generatePitchArrayFromJson(jsonData: any[]): number[] {\n  // const pitchArray = [];\n  const pitchArray: number[] = [];\n  const newdArray = [];\n  const data = jsonData;\n  let previousTimeInSeconds = 0;\n  let previousPitch = 0;\n\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\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: number[] = [];\n  pitchArray.forEach((pitch) => {\n    extendedArray.push(pitch);\n    for (let i = 0; i < divisorLocal; i++) {\n      extendedArray.push(pitch);\n    }\n  });\n\n  while (extendedArray.length > 1400) {\n    extendedArray.pop();\n  }\n  while (extendedArray.length < 1400) {\n    extendedArray.push(0);\n  }\n\n  return extendedArray;\n\n  // return pitchArray;\n}\n\ninterface FixedProps {\n  size: number[];\n  config: CONFIG;\n  isPlaying: boolean;\n  COLORS: COLORS;\n  showNotesPar: boolean;\n  playLyricCount: number;\n  gender: string;\n  syllableCount: string;\n  genderName: string;\n  onPlayLyricCountChange: (newCount: number) => void;\n  setBaseFilenames: (filenames: string[]) => void;\n  onAudioSrcChange: (newAudioSrc: string) => void;\n  isRetry: boolean;\n  setPlayingPause: () => void;\n  divisor: number;\n  initialRange: number[];\n  isListen: number;\n  setIsListen: (num: number) => void;\n  setMaxLyricCount: (num: number) => void;\n}\n\nconst Fixed: React.FC<FixedProps> = ({\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  const {\n    pitch,\n    setPitch,\n    mouseHeight,\n    realVoiceColor,\n    targetVoiceColor,\n    closeVoiceColor,\n    ballYCurr,\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\n    updateBallY,\n    updateCanvasHeight,\n    handleMouseMove,\n  } = useCanvasHooks(size, divisor, COLORS, initialRange);\n  const [shouldDisabled, setShouldDisabled] = useState<boolean>(false);\n  const desiredLength = Math.floor(size[1] / divisor);\n  const initialColorChangesFull = new Array(CanvasLength).fill(false);\n  const initialBallHistoryFull = new Array(CanvasLength).fill(NaN);\n  const [colorChangesFull, setColorChangesFull] = useState<boolean[]>(initialColorChangesFull);\n  const [ballHistoryFull, setBallHistoryFull] = useState<number[]>(initialBallHistoryFull);\n  const resetStatesFull = () => {\n    setColorChangesFull([...initialColorChangesFull]);\n    setBallHistoryFull([...initialBallHistoryFull]);\n    setCurrentX(initialcurrentX);\n  };\n  const [pitchArray, setPitchArray] = useState<number[]>([]);\n  const [jsonFiles, setJsonFiles] = useState<string[]>([]);\n  const [audioSrc, setAudioSrc] = useState<string>('');\n\n  // +++++++++++++++++++++++++++++++++++++++++++++++++\n  // Hooks useEffect parts \\\\\n\n  // initialize get pitch function + pause + draw background\n  useCanvasInitializeGetPitch(config, setPitch, updateCanvasHeight, setPlayingPause, canvasRef, initialRange, showNotes);\n\n  // set canvas size for different resolutions\n  useCanvasAdjustHeight(canvasRef, setCanvasHeight);\n\n  // store current pitch\n  useCanvasUpdatePitch(isPlaying, pitch, updateBallY);\n\n  // update mouse text\n  useCanvasMouseText(canvasRef, mouseHeight, initialRange);\n\n  // change Notes and hz display\n  useCanvasChangeHzAndNotes(setShowNotes, showNotes, showNotesPar, canvasRef, initialRange, setNotesLabel, setFreqLabel, canvasHeight);\n\n  // retry\n  useCanvasRetry(isRetry, divisor, setPlayingPause, resetStatesFull);\n\n  // redraw background when hz or notes changed\n  useCanvasRedrawBackground(canvasRef, showNotesPar, initialRange);\n\n\n  // +++++++++++++++++++++++++++++++++++++++++++++++++\n  // Unique useEffect parts \\\\\n\n  // render user curve\n  useEffect(() => {\n\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        const textX = canvas.width - 100;\n        const textY = 20;\n        ctx.clearRect(0, 0, textX - 5, canvas.height);\n        ctx.clearRect(0, textY + 5, canvas.width, canvas.height - (textY + 5));\n\n        drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\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        }\n\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\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\n  }, [COLORS, initialRange, pitchArray, ballHistoryFull, showNotes, showNotesPar]);\n\n  // render listen curve\n  useEffect(() => {\n    resetStatesFull();\n    setPlayingPause();\n    const canvas = canvasRef.current;\n    let animationFrameId: number;\n\n    if (isListen > 1 && canvas) {\n      const ctx = canvas.getContext('2d');\n      if (ctx) {\n        // ctx.clearRect(0, 0, canvas.width, canvas.height);\n        const textX = canvas.width - 100;\n        const textY = 20;\n        ctx.clearRect(0, 0, textX - 5, canvas.height);\n        ctx.clearRect(0, textY + 5, canvas.width, canvas.height - (textY + 5));\n\n        drawBackground(canvasRef, initialRange[1], initialRange[0], showNotes);\n\n        let drawnUntil = 0;\n        let lastFrameTime = Date.now();\n\n        const draw = () => {\n          const now = Date.now();\n          const deltaTime = now - lastFrameTime;\n          const elementsPerFrame = deltaTime / (1000 / 6) * 135;\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\n          if (drawnUntil < pitchArray.length) {\n            lastFrameTime = now;\n            animationFrameId = requestAnimationFrame(draw);\n          } else {\n            cancelAnimationFrame(animationFrameId);\n          }\n        };\n\n        draw();\n\n        return () => {\n          if (animationFrameId) {\n            cancelAnimationFrame(animationFrameId);\n          }\n        };\n      }\n    }\n  }, [isListen, pitchArray]);\n\n  useEffect(() => {\n    setIsListen(1);\n  }, [pitchArray]);\n\n  // next\n  useEffect(() => {\n    setPlayingPause();\n    resetStatesFull();\n  }, [playLyricCount])\n\n  useEffect(() => {\n    let url = '';\n    if (gender === 'male') {\n      url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/list.json';\n    }\n    else {\n      url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/list.json';\n    }\n\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      }\n      else {\n        url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/' + filename;\n      }\n      fetch(url)\n        .then(response => {\n          if (!response.ok) {\n            throw new Error('Network response was not ok');\n          }\n          return response.json();\n        })\n        .then(data => {\n          const pitches = generatePitchArrayFromJson(data.data);\n          setPitchArray(pitches);\n        })\n        .catch(error => {\n          console.error('Error fetching the JSON file:', error);\n        });\n    }\n  }, [playLyricCount, jsonFiles]);\n\n  useEffect(() => {\n    let url = '';\n    if (gender === 'male') {\n      url = 'https://ceas5.uc.edu/transvoice/jsondata/' + syllableCount + '/' + gender + '/list.json';\n    }\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)\n      .then(response => {\n        if (!response.ok) {\n          throw new Error('Network response was not ok');\n        }\n        return response.json();\n      })\n      .then(data => {\n        setJsonFiles(data.json_files);\n\n        const modifiedArray = data.base_filenames.map((element: any) => 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          }\n          else {\n            url = 'https://ceas5.uc.edu/transvoice/jsonDataOm/' + gender + '/' + genderName + '/' + syllableCount + 'syllable/' + data.json_files[0];\n          }\n\n          return fetch(url);\n        } else {\n          throw new Error('No files available');\n        }\n      })\n      .then(response => {\n        if (!response.ok) {\n          throw new Error('Network response was not ok');\n        }\n        return response.json();\n      })\n      .then(firstFileData => {\n        const pitches = generatePitchArrayFromJson(firstFileData.data);\n        setPitchArray(pitches);\n      })\n      .catch(error => {\n        console.error('Error:', error);\n      });\n\n    onPlayLyricCountChange(0);\n\n  }, [gender, genderName, syllableCount]);\n\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      }\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\n  useEffect(() => {\n    onAudioSrcChange(audioSrc);\n  }, [audioSrc, onAudioSrcChange]);\n\n  const updateBallHistoryFull = (pitch: number) => {\n    let tempHistoryFull = [...ballHistoryFull];\n    let ctxdiv = currentX * divisor;\n\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\n    } else {\n      setShouldDisabled(true);\n      if (!shouldDisabled) {\n        setPlayingPause();\n      }\n    }\n    setCurrentX(currentX + 1);\n    setBallHistoryFull(tempHistoryFull);\n  };\n\n  useEffect(() => {\n    if (isPlaying) {\n      if (pitch !== null) {\n        updateBallHistoryFull(pitch);\n      } else {\n        updateBallHistoryFull(0);\n      }\n    }\n  }, [pitch, isPlaying]);\n\n  useEffect(() => {\n    if (shouldDisabled && isPlaying) {\n      resetStatesFull();\n      setShouldDisabled(false);\n    }\n  }, [isPlaying]);\n\n\n  return (\n    <Row style={{ maxHeight: \"27vw\", marginBottom: \"5vw\", maxWidth: \"100vw\" }}>\n      <Col span={1}>\n      </Col>\n      <Col span={22}>\n        <div className=\"yAxisArea\" style={{ height: canvasHeight }}>\n          <Row style={{ height: canvasHeight }}>\n            <Col span={8}>\n              {showNotesPar\n                ? <div style={{ height: canvasHeight }} className=\"yAxisLabel\">Pitch (Notes)</div>\n                : <div style={{ height: canvasHeight }} className=\"yAxisLabel\">Pitch (Hz)</div>}\n            </Col>\n            <Col span={8}>\n              <div className=\"yAxisNumbers\" style={{ height: canvasHeight * 1.039 }}>\n                {showNotesPar\n                  ? notesLabel?.map((note, index) => <div key={index}>{note}</div>) ?? []\n                  : freqLabel?.map((freq, index) => <div key={index}>{freq}</div>) ?? []}\n              </div>\n            </Col>\n            <Col span={8}>\n              <div className=\"yAxisLines\" style={{ height: canvasHeight }}>\n                {freqLabel?.map((_, index) => (\n                  <div></div>\n                )) ?? []}\n              </div>\n            </Col>\n          </Row>\n        </div>\n\n        <div style={{ height: canvasHeight }}>\n          <canvas\n            ref={canvasRef}\n            onMouseMove={handleMouseMove}\n            id=\"pitchCanvas\"\n            width={size[1]}\n            height={size[0]}\n            style={{ border: '1px solid #000' }}\n          ></canvas>\n          <div\n            className='XAxisNum'\n            style={{\n              top: canvasHeight,\n              width: canvasHeight * 3.486,\n\n            }}\n          >\n            {[...Array(11)].map((_, index) => (\n              <div key={index} style={{ position: 'relative' }}>\n                <div className=\"timeMarkerLine\" />\n                <span className='timeMarkerNum'>\n                  {((15 / (divisor / 4)) * (index / 10)).toFixed(1)}\n                </span>\n              </div>\n            ))}\n          </div>\n          <div\n            style={{\n              top: canvasHeight * (1.12),\n              width: canvasHeight * 3.486,\n            }}\n            className='XAxis'\n          >\n            <div>Time (Seconds)</div>\n\n          </div>\n\n        </div>\n\n      </Col>\n      <Col span={1}>\n      </Col>\n    </Row>\n  );\n}\n\nexport default Fixed;"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}