ScorePlayer 3
이 글은 ScorePlayer 시리즈의 4번째 기록입니다. (총 6개)
오늘 한 일
- 악보를 실제로 그려 성능을 쟀다. 대보표 두 단·음표 스물여덟·가사까지 담은 화면을 4K로 그리는 데 프레임당 4.5ms가 나왔다.
- 이유: 스택을 고르기 전에 “렌더가 병목인가”를 알아야 했다. 결과는 아니었다 — 인코딩이 43ms라 그리기는 10분의 1이다.
- 덤: CPU 렌더로 충분하다는 뜻이라 GPU 스택을 안 써도 된다. 웹뷰가 막혔던 지점을 아예 우회한다.
- 스택을 Rust로 확정하고 뼈대를 세웠다. 장면 그리기·표시·악보 모델·튜닝 수치를 각각 다른 파일로 갈랐다.
- MusicXML 어댑터를 붙여 MVP를 만들었다. 파일을 열면 악보가 흐르고, 해상도를 골라 투명 영상으로 뽑을 수 있다.
- 압축 악보 파일(.mxl)을 그대로 열게 했다. 안에 든 목차 파일이 어느 것이 본체인지 가리킨다.
- 실제 악보를 열어 보고 표기를 채웠다 — 음자리표, 마디선, 임시표, 조표, 쉼표, 이음줄, 붙임점, 그리고 8분음표 이하의 꼬리와 빔.
막힌 부분
음표만 그려 놓으니 악보로 읽히지 않았다
처음 실제 악보를 열었을 때 화면에는 오선과 음표 머리, 기둥뿐이었다. 자리표가 없으니 같은 자리에 있는 점이 무슨 음인지 알 수 없고, 마디선이 없으니 어디서 한 마디가 끝나는지 보이지 않는다. 8분음표와 4분음표가 똑같이 생겨서 리듬도 안 읽혔다.
- 해결: 표기를 한 묶음으로 채웠다. 음자리표·조표는 왼쪽에 고정해 악보가 흘러도 남아 있게 하고, 마디선·임시표·쉼표·꼬리·빔은 음표와 같이 흐르게 했다.
- 남은 한계: 박자표 기호와 잇단음표 표시는 아직 없다. 박자는 맞고 숫자만 없는 상태다.
왼쪽 고정 칸을 만들었더니 흐르는 음표와 겹쳤다
자리표와 조표를 왼쪽에 붙박이로 두자, 그 자리를 지나가는 음표가 기호 위에 겹쳐 그려져 둘 다 읽히지 않았다.
보통은 그 칸을 불투명한 사각형으로 덮으면 되지만, 이 도구의 결과물은 투명 영상이다. 흰 사각형으로 덮으면 영상에 흰 판이 그대로 남는다.
- 해결: 그 칸의 알파를 0으로 되돌려 비운 뒤, 오선과 기호를 다시 그렸다. 덮는 게 아니라 지우는 방식이다.
악보 파일의 시간이 마디 안에서 뒤로 되감긴다
피아노 두 단은 한 마디 안에 오른손을 다 적고, 커서를 마디 처음으로 되감아 왼손을 적는 식으로 저장된다. 이걸 모르면 왼손이 오른손 뒤에 이어 붙어 마디가 두 배로 길어진다.
오른손 4박 → (되감기 4박) → 왼손 4박
- 해결: 되감기·건너뛰기 지시를 커서 이동으로 처리했다. 화음도 같은 원리로, 앞 음표와 같은 시각에 놓이도록 커서를 되돌린다.
- 그리고 파일이 적어 준 길이는 분할 단위라, 어댑터에서 초로 환산해 넘긴다. 그리는 쪽은 분할 단위를 모른다.
투명 영상은 색을 되돌려야 한다
그리기 도구는 반투명한 색을 미리 곱해 저장하는데, 영상 인코더는 곱하지 않은 값을 기대한다. 그대로 넘기면 반투명한 부분이 전부 어두워진다.
되돌리는 일을 인코더 쪽 필터에 맡기면 1.6배 빨랐다. 그런데 결과를 열어 보니 반투명 재생선이 원래 색이 아니라 곱해진 값 그대로였다. 빠른데 틀린 길이었다.
- 해결: 우리 쪽에서 되돌리되 코어에 나눠 돌렸다. 1.8배 빨라졌고 결과는 단일 코어와 비트 단위로 같았다.
다음에 할 일
- 재생 소리 붙이기
- 가사 직접 입력과 보정 화면
- 구간만 뽑는 기능 — 긴 곡을 통째로 뽑으면 파일이 너무 크다
- 박자표 기호와 잇단음표 표시