능동적 분할의 구현 방법

마디의 능동적 분할이란?

패턴 파일에 있는 한 마디당 데이터의 수에 근거, 계산을 통해 마디를 일정한 비트로 분할하는 기능. BMS (.bms와 그밖의 BMS를 기반으로 한 포맷들), K-Shoot MANIA (.ksh) 등이 이를 채택하고 있다.

구현 방법

  • 이것을 위해선 bar 내에 들어있는 beat의 수가 몇 개인지 구해야 한다. 또한, 특수명령을 beat로 잘못 카운트 하는 일이 없도록 해야 한다
    • 숫자가 아니면 넘길 것
  • --를 만날 때까지 나오는 스텝 명령의 개수 n을 구한다
    • 특수명령은 해당 비트 위에 쓰인 것을 적용시킨다
* 현재 박자 (특수명령 : beat)를 구한다. n의 개수와 박자 (192의 최소 약수인 2,3,5를 사용)의 최소공배수를 구한다?

    * n은 최소 비트 단위(192)의 약수여야 한다.

    * n = 8, beat = 4/4 일 때, n과 2의 최소공배수는 8로, 마디는 8분할 된다.

    * n = 6, beat = 4/4 일 때, n과 2의 최소공배수는 6으로, 마디는 6분할 된다.

    * n = 5, beat = 5/8 일 때, n과 5의 최소공배수는 5이며, 분모가 8이므로 마디는 0.5가 된 뒤 5분할 된다. - 8분음표 5개

* 즉, 박자표의 윗 부분은 n과 함께 마디를 몇으로 분할할지에 대해 산출하며, 아랫 부분은 4를 기준으로 마디가 재생되는 길이를 단축시킨다.
1/4가 1bar의 기준 속도이고, 1/8이라면 0.5, 1/16이라면 0.25... 같은 식.

    * 16/16 : 16분음표 * 16, 시간은 4/4와 같은데?
  • 굳이 위 내용처럼 복잡하게 생각할 필요가 없었다. 간단하게 bar의 시간을 BPM 기반으로 구하고, 이것을 beat의 수로 나누면 된다. 박자는 분수로 취급하여, float값으로 1bar당 시간에 곱한다. 예를 들어, 6/4박자가 나온다면 1.5를 곱하는 식.
  • BMS, ksh의 방식도 이와 같다. 극히 단순한 내용이었기 때문에 인터넷을 뒤져봐도 나오질 않은 것.