|
Midi의 음표와 쉼표2 |
조 : 2조 |
조장 : 블라디 미르 | |
조원 : 박노진, 블라디미르, 신배호, 미스토시 | |
주제 : Midi의 음표와 쉼표2 | |
작성일 : 20101201 |
작성자 : 김윤환 |
미디의 음표와 쉼표 1번 문서에서는 가변길이 수치가 적용이 안된 사례를 예를 들어서 설명하였는데 이번에는 TimeBase가 192인 가변길이 수치 데이터가 적용된 미디 파일로 예를 들어 설명하겠다.
TimeBase가 192 라면
음표 |
수치(10진수) |
4분음표 |
192 |
8분음표 |
96 |
16분음표 |
48 |
32분음표 |
24 |
매우 간단해 보이지만 해당 숫자들은 10진수로 표현 하였을 경우고 TimeBase가 192 일 경우 4분음표 192(’00 C0’hex) 는 가변길이 수치 변환으로 인해 81 40 으로 변한다.(가변길이변환 Write)
가변길이 변환 적용 후 음표 대비 수치
음표 |
수치(가변길이 변환) |
온음표 |
86 00 |
2분음표 |
83 00 |
4분음표 |
81 40 |
8분음표 |
60 |
16분음표 |
30 |
32분음표 |
18 |
다음은 TimeBase가 192인 MIDI 파일의 NoteOn의 한 부분을 갖고 악보를 그리는 예제다.
90 47 6E 82 50 90 47 00
↓
NoteOn |
“B” |
V.C |
Delta Time |
NoteOn |
“B” |
V.C | |
90 |
47 |
6E |
82 |
50 |
90 |
47 |
00 |
위의 16진수 조합은 “B” 음을 Delta Time [82 50 가변길이 hex] 동안 연주해주는 Midi Dessage이다.
여기서 Delta Time 82 50 은 가변길이 변환으로 인하여 생성된 것임을 알 수 있다. 이를 다시 원래의 값으로 돌려 준다면(가변길이 변환 Read)
82 50 을 이진수로 변환하여
1000 0010 0101 0000
7- 1 비트씩 끈는다.
1 |
0000010 |
0 |
1010000 |
1 |
7 |
1 |
7 |
그다음 1비트 씩 끈어진 값들을 삭제하면 된다.
0000010 1010000
->00 0001 0101 0000
->0001 0101 0000
=> 10진수 336
여기서 10진수 336은 TmeBase 192의 2분음표 382 수치와 4분음표 192 의 사이이다.
이를 다시 표현하기 위하여 음표 수치별로 맞추어야하는데 일단 제일 가까운 수치별로 빼는 방법이다.
336 – 192 = 144
144 역시 해당하는 음표 수치가 없음으로 가장 가깝고 144보다 작은 수치로 뺀다.
144 - 96 = 48
48 은 16분음표와 같기 때문에 더 이상 빼지않는다.
결과적으로 336은
192 + 96 + 48 = 336 이라는 수치가 나오고
이는 4분음표 + 8분음표 + 16분음표 라는 결과가 나온다.
하지만 DeltaTime 336 으로 “B’ 음 하나로 이어져 있으니
결과적으로는
이러한 음표로 변형이 되는 알고리즘이 필요하다.