1

작곡 프로그램 개발 일지 3

작곡 프로그램 개발 일지 3

노아의 블로그

    목차
반응형

오늘도 작곡 프로그램을 만들기 위해 공부하고 있다.

<유튜브 언제나 휴일님의 강의를 들었습니다.> 좋은 자료 감사드립니다.

 

 

어제는 청크에 대해서 알아보았다. 오늘은 헤더 청크에 대해서 알아보자.

 

헤더 청크 또한 4바이트(타입) 4바이트(길이) 데이터 영역으로 나뉘는데, 모두 고정적이다.

 

타입은 Mthd, 길이는 6 데이터는 Format(2byte), TrackCount(2byte) , Division(2byte)

 

로 나뉜다. 그래서 이러한 개념을 알고 헤더 청크를 분석해본다면 

먼저 ctype : 청크 타입을 확인해서 mthd 라면 헤더 객체를 생성한다.

 

헤더는 청크를 상속받고..

 

Data 영역의 6바이트가 각각 Format / TrackCount / Division으로 나뉘기 때문에 

 

Byte 배열의 Index(offset)을 입력해서 

2바이트씩 컨버팅 시킨다.

 

2바이트 = 16비트 = Short 

 

BitConverter.ToInt16 함수는 바이트 배열과 offset을 받아서

배열[offset]에서 2바이트 만큼 short로 반환하는것.

 

이 함수는 엔디안 방식을 따르지 않는것 같음.

따라서 컨버팅 후 Host Byte Order로 변환 필요!

=========================

 

is 문으로 chunk가 Header인지 확인하고 Header면 정보를 출력한다.

 

컨버팅된 데이터들이 들어올것!

 

여기서 Division은 Deltatime에 대한 정보를 가지고 있음 midi 파일은 이 델타타임으로 이벤트 타임을 계산함.. 아직 정확히는 모르겠음

 

암튼 이제 헤더 청크를 분석해보았는데

 

이제 트랙 청크를 분석해야 함.. 트랙 청크는

 

MTrk(4) Length(4) Event...로 구성됨

 

여기서 Event는 또 어떠한 정보들로 구성되는데.. Deltatime과 EventData로 나뉨.

 

Deltatime은 Event 발생 시점에 관한 정보이다.

 

Deltatime 계산 시 최상위 비트로 Deltatime이 오는지 계산한다고 한다.

 

최상위 비트가 1일 시 다음 바이트도 Deltatime이라는 뜻이고

최상위 비트가 0일 시 다음 바이트가 Event Data라는 뜻.

 

델타타임을 계산할 때는 최상위 비트를 빼고 둘이 더해서 

 

10001010 , 00100100

 

이게 있다면 최상위 비트를 뺀 

0001010 + 0100100 을 계산해서 Deltatime을 구한다고 한다... 아직도 먼지 모르겠당. ^^ 

 

쨋든.. 이제 파일에서 Deltatime을 읽어야 하는데

 

비트연산.... 순간 흠칫 했으나 순차적으로 사람이 보기 쉽게 변형한다면?

 

time을 누적시키는 연산이죠? 

time을 left shift 7번 하고

 

b & 0x7F를 한다.

 

0x7F는 이진수로 01111111. 즉

 

델타타임의 최상위 비트를 없애는 단계라고 할 수 있다. 

 

그래서 현재 deltatime은 7 비트를 가지게 되고 

time을 left shift 한 곳에 7비트를 가진 현재 deltatime을 or 연산을 해서 더하는것.

 

즉 이 연산은 결국 time을 누적하는 연산이라고 할 수 있다.

 

그 연산을 b가 127보다 클때만 반복한다.

왜냐면 127보다 작은 수는 최상위 비트가 0 이라서 다음 바이트는 deltatime이 아니게 되니까!!!

 

굉장히 힘들구먼...;;

반응형

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

작곡 프로그램 개발 일지 4  (0) 2023.10.17
작곡 프로그램 개발 일지 2  (0) 2023.10.15
작곡 프로그램 개발 일지  (0) 2023.10.11