Please write a typescript function that returns a typed json object from a UltraStar txt file format.

UltraStar txt File Format:

UltraStar txt files are plain text files for karaoke songs. They hold informations about the notes and lyrics to sing, as well as some metadata about the song (e.g. artist, title, year, genre, video file).

The layout of this information in file is

Metadata
Notes and lyrics for each player
First a line with the target player, which is one of P1, P2, P3, ...
UltraStar historically supports only duets with two players, i.e. only P1 and P2. And P3 was used as "notes for both P1 and P3". Note that UltraStar Play does not support this P3 notation.
Afterwards each line describes one note or marks the end of a phrase.
Note description: The values are separated by space in the following order: NoteType StartBeat Lenght Pitch Text
End of phrase: - (dash) character followed by StartBeat, and optionally EndBeat. Here, StartBeat and EndBeat describe how long this phrase will show, respectively when the next phrase will be shown.
Optionally, the file ends with an E character on the last line to explicitly mark the end
Example:

#TITLE:My Cool Song (Duett)
#ARTIST:My Cool Artist
#MP3:audio.ogg
#BPM:100
#GAP:7500
#COVER:cover-image.jpg
#BACKGROUND:background-image-used-when-video-file-not-working.jpg
#GENRE:Pop
#YEAR:2007
#LANGUAGE:English
P1
: 0 5 0 Hello 
: 10 5 0 world!
- 15
: 20 5 0 How 
\* 30 5 2 are 
\* 40 5 4 you?
- 45
P2
: 50 5 0 Hello 
: 60 5 0 world!
- 70
E
Note Types
: normal note
\*: golden note
Gives more points
F: freestyle note
Does not contribute to the score
R: Rap note
contributes to the score, but pitch is irrelevant. Accepts any noise above threshold as "correct pitch".
G: Rap and golden note
Like rap, but gives more points
Pitch
The pitch corresponds to a MIDI note but shifted by 60.

A value of 0 in the txt file corresponds to MIDI note 60 (C4. aka. "middle C"). A value of 1 in the txt file corresponds to MIDI note 61, etc.

Metadata
The metadata is located at the start of the file. All metadata lines start with a # (hash sign), followed by the tag name in upper case, a colon, and the value of that tag. Example: #TITLE:Never Gonna Give You Up

Only few of the tags are mandatory, namely #Artist, #Title, #BPM, #MP3.

The following lists UltraStar txt tags. Note that the list is not exhaustive and UltraStar Play may not support all of them.

#TITLE

The song's title.
#ARTIST

The song's artist.
#GENRE

The song's genre.
#EDITION

Edition of the song, usually either the game it was ripped from or the TV show it was featured in.
#CREATOR

The user who timed/created the song.
#LANGUAGE

The song's language.
#COVER

The relative path to the cover image.
#MP3

The relative path to the audio file.
Note that other audio file formats such as ogg work as well.
#VOCALS

If the song at #MP3 is an instrumental version you can add an audio file containing the vocals here.
#VIDEO

The relative path to the video.
#BACKGROUND

The relative path to the background image. If the song has a video, this will only be shown if: video playback is disabled in the settings; the system cannot render the video smoothly enough; the video is shorter than the song, the background will be shown after the video has ended.
#BPM

Defines the grid for the notes. Recommendation is to use the beats-per-minute of the audio file.
Actually, the txt value will be multiplied by 4 to get the beats-per-minute. This is done to have more fine grained note positioning and note recording (pitch detection is done per beat).
Example: Using #BPM:100 in the txt file means a single beat has a duration of: 100\*4 [beat/minute] = 400 [beat/minute] ~~> 1/400 [minute/beat] = 60/400 [second/beat] = 0.15 [second/beat]
#RELATIVE

Boolean value (YES/NO) that indicates whether the note timestamps are relative to the previous note (YES) or to the start of the song (NO). Default is NO.
This tag is not supported by UltraStar Play. UltraStar Play always assumed a value of NO, i.e., non-relative beat positions.
#GAP

Milliseconds to shift the timing of ALL the notes. Positive numbers delay the notes, negative numbers do the opposite.
Example: Using #GAP:10000 in the txt file will shift notes by 10 seconds.
#VIDEOGAP

Seconds to delay the video playback.
Example: Using #VIDEOGAP:5 will cause the video to start after the music has been playing for 5 seconds.
#PREVIEWSTART

While selected in the song browser, a short preview of the song will play, starting at this many seconds in. Defaults to halfway through the song.
#DUETSINGERP1

#DUETSINGERP2

Custom names for players P1 and P2 of the song.
UltraStar txt 파일 형식에서 입력된 json 객체를 반환하는 타입스크립트 함수를 작성하세요.UltraStar txt 파일 형식:UltraStar txt 파일은 노래방 노래용 일반 텍스트 파일입니다. 여기에는 노래에 대한 메타데이터(예: 아티스트, 제목, 연도, 장르, 비디오 파일)뿐만 아니라 노래할 음표와 가사에 대한 정보가 들어 있습니다.파일에서 이 정보의 레이아웃은 다음과 같습니다.메타데이터각 플레이어에 대한 노트 및 가사먼저 P1, P2, P3, ... 중 하나 인 대상 플레이어가있는 한 줄입니다.UltraStar는 지금까지 두 명의 플레이어가 있는 듀엣, 즉 P1과 P2만 지원했습니다. 그리고 P3는 "P1과 P3 모두에 대한 노트"로 사용되었습니다. UltraStar Play는 이 P3 표기법을 지원하지 않습니다.이후 각 줄은 하나의 음표를 설명하거나 프레이즈의 끝을 표시합니다.음표 설명: 값은 다음 순서로 공백으로 구분됩니다: 음표 유형 시작박자 길이 피치 텍스트프레이즈 끝: -(대시) 문자 뒤에 StartBeat, 선택적으로 EndBeat를 입력합니다. 여기서 StartBeat와 EndBeat는 각각 다음 프레이즈가 표시될 때 이 프레이즈가 표시될 길이를 나타냅니다.선택 사항으로 파일 마지막 줄에 E 문자를 추가하여 끝을 명시적으로 표시할 수 있습니다.예시:#제목:나의 멋진 노래(듀엣)#ARTIST:나의 멋진 아티스트#MP3:audio.ogg#BPM:100#간격:7500#커버:커버 이미지.jpg#배경:배경-이미지-사용-비디오-파일이-작동하지-않을-때-사용된-배경-이미지.jpg#장르:팝#연도:2007#언어:영어P1: 0 5 0 Hello : 10 5 0 세계!- 15: 20 5 0 어떻게 \* 30 5 2 are \* 40 5 4 당신은?- 45P2: 50 5 0 안녕하세요 : 60 5 0 세계!- 70E노트 유형: 일반 노트\*: 황금 노트더 많은 점수 부여F: 자유형 음표점수에 기여하지 않음R: 랩 노트점수에 기여하지만 피치는 무관합니다. 임계값을 초과하는 모든 노이즈를 "올바른 피치"로 인정합니다.G: 랩 및 골든 노트랩과 비슷하지만 더 많은 점수 부여피치피치는 미디 음표에 해당하지만 60만큼 이동합니다.txt 파일에서 0 값은 미디 음표 60(C4. 일명 "중간 C")에 해당합니다. txt 파일에서 값이 1이면 미디 음표 61 등에 해당합니다.메타데이터메타데이터는 파일 시작 부분에 위치합니다. 모든 메타데이터 줄은 #(해시 기호)로 시작하고 대문자로 된 태그 이름, 콜론, 해당 태그의 값으로 이어집니다. 예시: #제목:절대 포기하지 않을게요아티스트, #타이틀, #BPM, #MP3 등 몇 가지 태그만 필수입니다.다음은 UltraStar txt 태그 목록입니다. 이 목록은 전체 목록이 아니며 UltraStar Play에서 모든 태그를 지원하지 않을 수 있습니다.#제목노래의 제목입니다.#아티스트노래의 아티스트입니다.#장르노래의 장르입니다.#EDITION노래의 에디션(일반적으로 노래가 리핑된 게임 또는 노래가 등장한 TV 프로그램)입니다.#크리에이터노래의 시간을 측정/제작한 사용자입니다.#언어노래의 언어.#커버커버 이미지의 상대 경로입니다.#MP3오디오 파일의 상대 경로입니다.ogg와 같은 다른 오디오 파일 형식도 사용할 수 있습니다.#보컬MP3의 노래가 악기 버전인 경우 여기에 보컬이 포함된 오디오 파일을 추가할 수 있습니다.#비디오동영상의 상대 경로입니다.#백그라운드배경 이미지의 상대 경로입니다. 노래에 동영상이 있는 경우 설정에서 동영상 재생이 비활성화되어 있거나, 시스템에서 동영상을 원활하게 렌더링할 수 없거나, 동영상이 노래보다 짧은 경우에만 표시되며, 동영상이 끝난 후에 배경이 표시됩니다.#BPM음표의 그리드를 정의합니다. 오디오 파일의 분당 비트를 사용하는 것이 좋습니다.실제로 txt 값에 4를 곱하여 분당 비트를 얻습니다. 이는 보다 세밀한 음표 위치 지정 및 음표 녹음을 위해 수행됩니다(음정 감지는 비트별로 수행됨).예시: txt 파일에 #BPM:100을 사용하면 단일 비트의 지속 시간은 다음과 같습니다: 100\*4 [비트/분] = 400 [비트/분] ~~> 1/400 [분/비트] = 60/400 [초/비트] = 0.15 [초/비트]#상대음표 타임스탬프가 이전 음표(예) 또는 곡의 시작(아니오)에 상대적인지 여부를 나타내는 부울 값(예/아니오)입니다. 기본값은 NO입니다.이 태그는 UltraStar Play에서 지원되지 않습니다. UltraStar Play는 항상 NO, 즉 상대적 비트 위치가 아닌 값을 가정합니다.#GAP모든 노트의 타이밍을 이동시킬 시간(밀리초)입니다. 양수 값은 음표를 지연시키고 음수 값은 그 반대를 수행합니다.예시: txt 파일에 #GAP:10000을 사용하면 음표가 10초씩 이동합니다.#비디오 갭동영상 재생을 지연시킬 시간(초)입니다.예시: 예: #VIDEOGAP:5를 사용하면 음악이 5초 동안 재생된 후 동영상이 시작됩니다.#미리 보기 시작노래 브라우저에서 노래를 선택하는 동안 이 몇 초 후부터 노래의 짧은 미리보기가 재생됩니다. 기본값은 곡의 중간 부분입니다.#듀엣싱어1#듀엣싱어2노래의 플레이어 P1 및 P2에 대한 사용자 지정 이름입니다.