이 글은 ScorePlayer 시리즈의 6번째 기록입니다. (총 6개)

오늘 한 일

  • 미리보기에서 소리가 나게 했다. 악보의 음표를 배음 섞은 합성음으로 울린다.
    • 이유: 볼이 제 박자에 튀는지는 결국 귀로 판단한다. 소리가 없으면 눈대중으로 맞춰 두고 나중에 전부 다시 잡게 된다.
    • 피아노 흉내가 목적이 아니라 박자 확인용이라 합성음으로 시작했다. 샘플 음원은 파일과 라이선스가 따라오므로 뒤로 미뤘다.
  • 재생 중 “지금 몇 초인가”를 소리 쪽에서 받아오도록 바꿨다. 화면은 그 값을 받아 그리기만 한다.
  • 재생·정지·처음으로·구간 이동이 모두 소리와 같이 움직이게 연결했다.
  • 소리가 실제로 나오는지 수치로 확인하는 진단 경로를 뒀다.
  • 이걸로 Phase 1에서 남은 큰 조각이 가사 직접 입력 하나가 됐다.

막힌 부분

소리는 만든 쪽에서 확인할 방법이 없다

화면은 프레임을 뽑아 눈으로 보면 되는데 소리는 그럴 수가 없다. “붙였다”고 말하려면 무엇을 근거로 삼을지부터 정해야 했다.

세 가지를 수치로 찍기로 했다.

오디오 장치 열림 · 1.2초 뒤 1.214초 · 2.0초 뒤 2.014초 (클럭이 흐르면 값이 는다)
출력 최대 크기 0.135 (0이면 소리가 안 실린 것)
  • 장치가 열렸나 — 못 열면 소리 없이 화면 시간으로 도니, 조용한 이유가 버그인지 장치인지 갈린다.

  • 시계가 실시간으로 도나 — 1.2초를 기다렸을 때 1.21초가 나오면 콜백이 제 속도로 돌고 있다는 뜻이다.

  • 소리가 실렸나 — 나가는 신호의 최대 크기가 0이면 시계만 돌고 소리는 안 실린 것이다.

  • 해결: 위 셋을 찍는 진단 경로(AUDIO_CHECK=1)를 두고 샘플 악보와 실제 악보(924음표)로 확인했다.

  • 남은 한계: 음색과 음량이 쓸 만한지, 그림과 정확히 맞는지는 여전히 귀로 판단해야 한다.

그림과 소리가 벌어지지 않으려면 시계를 하나만 둬야 한다

화면 프레임으로 시간을 세면 소리와 조금씩 어긋난다. 한 프레임의 오차는 작지만 곡이 길어질수록 쌓여서, 끝에 가면 볼이 소리보다 눈에 띄게 앞서거나 뒤진다.

그래서 재생 중에는 소리 쪽이 시간의 주인이 된다. 실제로 내보낸 소리의 양이 곧 경과 시간이라, 화면이 몇 프레임을 건너뛰든 둘이 벌어지지 않는다.

영상으로 뽑을 때는 반대다. 그때는 소리가 없고 실시간도 아니라서 프레임 번호가 시각이 된다. 같은 장면을 그리는 코드가 두 상황에서 다른 시계를 받아쓰는 셈이다.

  • 해결: 그리는 쪽은 시간을 스스로 세지 않고 받기만 하도록 두고, 재생일 때는 소리에서·추출일 때는 프레임 번호에서 받게 했다.

다음에 할 일

  • 소리 음색이 쓸 만한지 확인하고, 필요하면 샘플 음원으로 교체
  • 구간만 뽑는 기능 — 긴 곡을 통째로 뽑으면 파일이 너무 크다
  • 가사 직접 입력과 보정 화면
  • 박자표 기호와 잇단음표 표시
  • 두 단을 넘나드는 빔
  • 쉼표와 음표가 겹치는 나머지 경우

Series: ScorePlayer


Suggested Posts