1

작곡 프로그램 개발 일지 2

작곡 프로그램 개발 일지 2

노아의 블로그

    목차
반응형

midi 파일에 대해서 좀 더 알아볼 필요가 있다.

 

먼저, 다른 작곡 프로그램에서 노드를 찍어보았다.

 

피아노로 계이름 '파' 를 노드로 찍고 midi 파일로 받았다. 그리고 그것을 hex 데이터로 보아서 

수정을 해 보았다.

 

먼저 '파' 한번을 기록한 midi 파일이다. 

 

그리고 밑 부분 바이트를 수정해 주면

놀랍게도 '솔' 이 재생되었다.

 

문서를 보면서 여기저기 막 건들이면서 해봤는데, 이대로는 답이 없다고 판단.

 

여기까지 내가 안 내용은 헤더, 바디, 이벤트 그래서 노드 하나가 찍힐때 시작이 0x9? 로 시작된다는것

9 뒤에 오는것은 채널 (1~16) 

 

ex 채널 1이면 0x90

 

그 다음에 오는 내용은 Pitch와 세기..

 

그래서 0x90 , 3C , 50 은 도를 80의 세기로 누른다는것. 

 

0x8? 은 노드가 끝난다는 것...

 

이 정보를 가지고 도레미파솔을 찍어봤는데 원하는 대로 잘 안되어서 정보가 더 필요했다. 

 

 

그러던 중. 좋은 강의를 찾았다.

https://www.youtube.com/watch?v=TABkfDdmigI 

 

midi 분석 프로그램을 개발하는 강의인데, C#이고 한글이여서 아주 적합했다. 

 

좋은 자료 감사합니다!

 

그런데, 처음부터 알 수 없는 단어가 나와서 정리를 했음. ㅠ

https://htmlisnotaprogramminglanguage.tistory.com/131

 

빅 엔디안 리틀 엔디안(Byte Order)

(작곡 프로그램을 개발하기 전에 컴퓨터 공부를 좀 해야된다.. 왜냐하면 결국 파일에 기록을 하거나 읽어야 되기 떄문.. ) 컴퓨터의 바이트 저장 방식은 두가지로 나뉜다고 한다. 첫 번째는 빅 엔

htmlisnotaprogramminglanguage.tistory.com

https://htmlisnotaprogramminglanguage.tistory.com/132

 

빅 엔디안 리틀 엔디안(Byte Order) - 2

왜 Byte Order를 사용할까? 먼저 산술에 관한 이야기이다. 어떤 수를 더한다고 했을 시 Big Endian 방식으로 저장된 수와 Little Endian 방식으로 저장된 수가 있다고 해보자. Big Endian 방식으로 더하기를

htmlisnotaprogramminglanguage.tistory.com

이러한 개념을 습득하고.. 진행을 하던 중!!

 

또 다시 머리가 지끈..

 

midi 파일은 Chunk 라는 개념이 있는데 Chunk는 덩어리? 조각? 이라고 한다..

 

midi 파일의 청크는 청크 타입 / 청크 길이 / 데이터 형식으로 구분되며 

 

청크 타입과 청크 길이는 4바이트로 기록되며 , 데이터 형식은 청크 길이만큼 가지고 있다.

 

그래서 여기서는 BinaryReader의 ReadInt32로.. 4바이트를 읽어오는것! 

 

암튼 이 청크라는것을 파일에서 읽어와서 프린트를 해 보는 작업을 가져야 하는데, 문제점이 하나 생겼다.

빅 엔디안과 리틀 엔디안이라는 개념을 이해했으나, 왜 ctype는 컨버트를 하지 않고 length만 컨버트 하는지 모르겠다...

 

그래서 디버깅을 해 본 결과. 내 시스템은 리틀 엔디안 방식이라서 ctype이 거꾸로 되있는것을 볼 수 있다.

 

이것을 바이트로 나누면 64/68/54/4D 

4바이트다. 이것을 다시 Int로 변환하면.. 

 

100/104/84/77 이다.

 

이것을 아스키 코드로 변환하면.. 

 

원래 파일은 MThd인데 역시 거꾸로 되어있다!!!

 

근데 왜 제대로 출력될까??? 너무 의문이다.

다시 디버깅을 해 보니 출력이 될 때, 이 함수를 거쳐서 출력된다. 

 

확인해본 결과, byte배열에는 순차적인 데이터가 들어가 있다.

즉 BitConverter의 GetBytes 함수가 어떤 역할을 해서 순서대로 다시 변경된 것.

 

MicroSoft 공식 사이트에는 GetBytes 함수에 대한 설명이 이렇게 되어있다..

즉.. 거꾸로 되어있는 데이터를 다시 little endian으로 읽어서 바이트 순서가 뒤바뀌어서 원 상태로 복귀된것...

 

 

 

반응형

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

작곡 프로그램 개발 일지 3  (0) 2023.10.16
작곡 프로그램 개발 일지  (0) 2023.10.11
Unity 행사에 다녀오다!  (0) 2023.10.11