1

작곡 프로그램 개발 일지 8

작곡 프로그램 개발 일지 8

노아의 블로그

    목차
반응형

자 이제 사용자가 입력을 하면 그에 맞게 파일로 작성이 되고 작곡이 된다..

 

하지만 아직 박자를 맞추지 못하였다.

 

박자는 일단 1박 / 2박 / 3박 / 4박을 하려고 했는데.

 

앞서 학습한 정보에 따르면 Header Chunk에서 데이터 영역의 Division이 바로 Tick Per Beat : 박자 당 틱이다.

(또 최상위 비트를 봐서 뭔가로 나뉜다고는 하는데 내 파일에서는 Division이 맞음)

 

내가 복사한 정보는 Division이 60인데... 즉 한박 ( 4분음표) 가 60Tick이란 소리인것 같다.

 

60 * 박자를 하면 올바른 Deltatime이 나올 것이라고 가정을 하고 했는데.. 이상하게 안된다.

그리고 지금 델타타임을 5000으로 했는데도 8분음표로 나오는것을 보면 뭔가 문제가 있다..

 

자료를 검색 해 봤지만 잘 나오지 않는다. 

 

그냥 직접 테스트를 해보기로 하고 실제 작곡 프로그램에서 4분음표, 8분음표, 2분음표를 찍어서 Hex Data로 읽어보자.

 

먼저 4분음표다. 

83 5F

1000 0011 0101 1111

각 바이트의 최상위 비트를 제거한다,

1 1101 1111

= 479 

 

이제 8분 음표다.

81 6F 

1000 0001 0110 1111

각 바이트의 최상위 비트를 제거하면? 

1110 1111

239임...

 

이제 2분음표다. 

87 3F

1000 0111 0011 1111

최상위 비트를 제거하면?

11 1011 1111

959다.

 

1이 왜 빠져있는지는 모르겠지만

 

1을 추가한다고 가정했을 때 모든 박자는 60의 약수이다 .

 

무슨 관계인지 모르겠다. 분명 Division은 한 박당 틱이라고 해서 4분음표 하나는 60 tick인줄 알았는데?

 

이제 더이상 삽질을 하면 안된다...(시간이 없으므로) 그래서 Stack Overflow에 질문을 했다.

 

 

질문을 올려보고, 다시 파일을 검토 해 보았는데...

여기 파란색 부분이 Division 부분이다. 그런데? 뭔가 이상함을 느낌...

뒤에 00은 뭐지? 설마 이 부분도 같이 인식되어서 Division 값이 변경되는것인가?

그렇다 쳐도 3C00은 15360이기에 479가 나오는게 말이 안되긴 해도, 이 00 부분을 3C로 바꿔보았다. 

 

 

<Division이 3C00>

이전 파일에서 3C를 첫 번째 자리로 옮긴 결과...

<Division이 003C>

역시 되었다.

 

더 테스트 해본 결과, 이 문제는 그냥 내가 혼자 파일의 바이트를 마구잡이로 변경해서

내가 변경한 위치를 모르고 약간 혼동이 온 것 같다. 다시 순차적으로 해 보니 답을 찾음! (다행)...

 

자, 이제 작곡을 하기 전에 한가지 문제만 해결하면 된다. 

Deltatime은 Int타입인데 파일에 쓰기 위해서 GetByte 함수를 쓰면 의도하지 않은대로 변환된다.

 

예시를 들자면, 변환할 Deltatime에 1을 입력하면 .. 1은Byte로 00000001이다. 하지만 변환되는 Byte 배열에는 

[1],[0],[0],[0] 이 들어간다. 그 이유는 Int 타입은 4바이트라서 나머지 00000000 00000000 00000000이 들어가기 때문...

 

그래서 타입에 맞게 변환해주는 과정이 필요함..

 

이런식으로 Shift를 통해 들어온 타입이 어떤 크기를 가지고 있는지 체크 한 후, 그에 맞게 처리를 진행하도록 결정했다.

 

자.. 그러면 이제 박자를 넣어서 작곡을 해 보자!! 

테스트로, <학교 가는길> 의 멜로디를 입력하고 

midi 파일을 읽어보면!!

 

입력한 박자대로 완성이 되 있는 모습을 볼 수 있다.

 

개선의 여지가 있지만 많이 발전했다!! 굿...

반응형

'GAME > Unity' 카테고리의 다른 글

작곡 프로그램 개발 일지 9  (0) 2023.10.22
5번째로 만든 게임  (0) 2023.10.19
작곡 프로그램 개발 일지 7  (0) 2023.10.19