메트로놈 제작에 앞서 BPM에 대한 이해가 필요하다.
Beats Per Minute의 약자인데 음악의 속도를 숫자로 표현한 것이다.
영어단어에서 알 수 있듯이, 속도의 기준은 1분(60초)이다.
BPM이 60인 음악은 4/4 박자 기준 60개의 4분음표를 가진다.
반대로 1초에 4분음표 한개라고도 볼 수 있다.
그렇다면, 메트로놈에 60을 입력하면 1초에 한번씩 소리가 출력되어야 한다.
이 것을 수식으로 나타낼 수 있다.
( 60 / BPM ) * ( Tempo / Tempo2 )
BPM은 해당 음악의 속도
Tempo에는 해당 음악의 박자표(4/4, 3/4, 6/8 등)를 입력 받으면 된다.
예시로
BPM에 60, 박자표에 4/4를 입력하고 계산하면 1이란 값이 나온다.
(60 / 60) * (4 / 4) = 1
프로그램은 계산해서 나온 값을 토대로 1초마다 소리를 출력 해주면 된다.
이 것을 코드에 옮겨주면 된다.
제작은 유니티엔진으로 할 것이다.
Sync.cs 파일을 생성했다.
위에서 설명한 예시를 그대로 옮겼다.
콘솔에서 1이란 값을 잘 보여주고 있다.
이제, 그 값에 맞추어 소리를 출력해주면 된다.
소리를 출력하기 위한 코드를 작성했고 사운드파일은 https://freesound.org/ 에서 구했다
콘솔창에서 실제 시간을 확인 할 수 있는데, 실제 시간에 맞추어 한번씩 실행되는 것을 확인 할 수 있었다.
추가적으로 수식에서 float형과 int형이 연산이 되어지는 것을 보고, 변수를 전부 float로 바꿨다.
알아서 변환이 되겠지만, 성능 문제가 있을 것이라고 생각 했다. (확실하진 않다)
60BPM이 1초에 1번씩이니 120BPM은 0.5초에 1번씩이다.
(이 시점에서 오차의 존재를 확인했다.
언뜻 보기에 정확히 0.5초에 1번씩 실행되는 것 처럼 보이지만
소수점 3번째 자리부터 값이 모두 다른 것을 확인 할 수 있었다.
조그만한 차이지만 싱크에 문제가 발생할 것 같아서 관련자료를 찾아보았다. 이 문제는 추후에 다룰 예정이다.)
아무래도 소리만 출력되니 눈이 심심하다.
박자에 맞추어 노트 객체가 오른쪽으로 회전하게 만들 것이다.
여기에 적혀질 코드는 별거 없다.
객체를 회전시켜주는 코드를 작성했다.
이제 위의 코드를 박자에 맞추어 불러주면 된다.
PlayTik 코루틴에 해당 메소드를 추가했다.
실행화면 ( BPM:120 박자:4/4 )
'유니티 > 리듬게임' 카테고리의 다른 글
[개발일지8] 중간 진행 상황 (0) | 2019.05.31 |
---|---|
[개발일지7] 메트로놈 재설계 (0) | 2019.05.26 |
[개발일지6] 노트생성 (8) | 2019.05.21 |
[개발일지5] 노트파서 (2) | 2019.05.19 |
[개발일지3] 리듬게임 시스템 설계 (0) | 2019.04.10 |