Decimal, hex і binary у MIDI: числа 0–127 та байти 0–255

Навчальна схема з одним MIDI-байтом, показаним одночасно у десятковому, шістнадцятковому та двійковому форматах.
Навчальна схема з одним MIDI-байтом, показаним одночасно у десятковому, шістнадцятковому та двійковому форматах.
Зображення створено за допомогою генеративного ШІ для MIDITAUR. Концепція, композиція та текстове наповнення — MIDITAUR

Зміст публікації

Перетворення hexadecimal і binary

У MIDI часто доводиться бачити одне й те саме число у трьох записах: десятковому (60), шістнадцятковому (0x3C) і двійковому (0111100). Це не три різні значення — це три способи записати те саме число.

Чому в MIDI так часто зустрічається 0–127

Класичні MIDI 1.0 data bytes використовують 7 значущих бітів, тому багато параметрів мають діапазон 0–127. Наприклад, номер ноти, velocity або значення більшості Control Change.

Старший біт байта використовується для розрізнення типів байтів: у status byte він дорівнює 1, а у data byte — 0. Саме тому повний байт має 0–255, але звичайне 7-бітне MIDI-значення — 0–127.

Як читати hex

Шістнадцяткова система використовує цифри 0–9 і літери A–F.

Одна hex-цифра представляє рівно 4 біти — nibble. Тому повний 8-бітний байт записується двома hex-цифрами: наприклад, 0x90 = 1001 0000.

  • decimal 10 = hex 0x0A;
  • decimal 60 = hex 0x3C;
  • decimal 127 = hex 0x7F;
  • decimal 144 = hex 0x90.

Останній приклад особливо корисний: 0x90 — status byte Note On для MIDI-каналу 1.

Таблиця 7-бітних значень 0–127

Dec Hex Binary
0 0x00 0000000
1 0x01 0000001
2 0x02 0000010
3 0x03 0000011
4 0x04 0000100
5 0x05 0000101
6 0x06 0000110
7 0x07 0000111
8 0x08 0001000
9 0x09 0001001
10 0x0A 0001010
11 0x0B 0001011
12 0x0C 0001100
13 0x0D 0001101
14 0x0E 0001110
15 0x0F 0001111
16 0x10 0010000
17 0x11 0010001
18 0x12 0010010
19 0x13 0010011
20 0x14 0010100
21 0x15 0010101
22 0x16 0010110
23 0x17 0010111
24 0x18 0011000
25 0x19 0011001
26 0x1A 0011010
27 0x1B 0011011
28 0x1C 0011100
29 0x1D 0011101
30 0x1E 0011110
31 0x1F 0011111
32 0x20 0100000
33 0x21 0100001
34 0x22 0100010
35 0x23 0100011
36 0x24 0100100
37 0x25 0100101
38 0x26 0100110
39 0x27 0100111
40 0x28 0101000
41 0x29 0101001
42 0x2A 0101010
43 0x2B 0101011
44 0x2C 0101100
45 0x2D 0101101
46 0x2E 0101110
47 0x2F 0101111
48 0x30 0110000
49 0x31 0110001
50 0x32 0110010
51 0x33 0110011
52 0x34 0110100
53 0x35 0110101
54 0x36 0110110
55 0x37 0110111
56 0x38 0111000
57 0x39 0111001
58 0x3A 0111010
59 0x3B 0111011
60 0x3C 0111100
61 0x3D 0111101
62 0x3E 0111110
63 0x3F 0111111
64 0x40 1000000
65 0x41 1000001
66 0x42 1000010
67 0x43 1000011
68 0x44 1000100
69 0x45 1000101
70 0x46 1000110
71 0x47 1000111
72 0x48 1001000
73 0x49 1001001
74 0x4A 1001010
75 0x4B 1001011
76 0x4C 1001100
77 0x4D 1001101
78 0x4E 1001110
79 0x4F 1001111
80 0x50 1010000
81 0x51 1010001
82 0x52 1010010
83 0x53 1010011
84 0x54 1010100
85 0x55 1010101
86 0x56 1010110
87 0x57 1010111
88 0x58 1011000
89 0x59 1011001
90 0x5A 1011010
91 0x5B 1011011
92 0x5C 1011100
93 0x5D 1011101
94 0x5E 1011110
95 0x5F 1011111
96 0x60 1100000
97 0x61 1100001
98 0x62 1100010
99 0x63 1100011
100 0x64 1100100
101 0x65 1100101
102 0x66 1100110
103 0x67 1100111
104 0x68 1101000
105 0x69 1101001
106 0x6A 1101010
107 0x6B 1101011
108 0x6C 1101100
109 0x6D 1101101
110 0x6E 1101110
111 0x6F 1101111
112 0x70 1110000
113 0x71 1110001
114 0x72 1110010
115 0x73 1110011
116 0x74 1110100
117 0x75 1110101
118 0x76 1110110
119 0x77 1110111
120 0x78 1111000
121 0x79 1111001
122 0x7A 1111010
123 0x7B 1111011
124 0x7C 1111100
125 0x7D 1111101
126 0x7E 1111110
127 0x7F 1111111

Повна таблиця 8-бітних значень 0–255

Первинний матеріал містив повну таблицю 0–255. Нижче вона відновлена у компактному форматі з чотирма групами на рядок. Це довідник для повного 8-бітного byte; у звичайних MIDI 1.0 data bytes значущий діапазон зазвичай 0–127, тоді як status bytes мають старший біт 1.

Dec Hex Binary Dec Hex Binary Dec Hex Binary Dec Hex Binary
0 0x00 00000000 64 0x40 01000000 128 0x80 10000000 192 0xC0 11000000
1 0x01 00000001 65 0x41 01000001 129 0x81 10000001 193 0xC1 11000001
2 0x02 00000010 66 0x42 01000010 130 0x82 10000010 194 0xC2 11000010
3 0x03 00000011 67 0x43 01000011 131 0x83 10000011 195 0xC3 11000011
4 0x04 00000100 68 0x44 01000100 132 0x84 10000100 196 0xC4 11000100
5 0x05 00000101 69 0x45 01000101 133 0x85 10000101 197 0xC5 11000101
6 0x06 00000110 70 0x46 01000110 134 0x86 10000110 198 0xC6 11000110
7 0x07 00000111 71 0x47 01000111 135 0x87 10000111 199 0xC7 11000111
8 0x08 00001000 72 0x48 01001000 136 0x88 10001000 200 0xC8 11001000
9 0x09 00001001 73 0x49 01001001 137 0x89 10001001 201 0xC9 11001001
10 0x0A 00001010 74 0x4A 01001010 138 0x8A 10001010 202 0xCA 11001010
11 0x0B 00001011 75 0x4B 01001011 139 0x8B 10001011 203 0xCB 11001011
12 0x0C 00001100 76 0x4C 01001100 140 0x8C 10001100 204 0xCC 11001100
13 0x0D 00001101 77 0x4D 01001101 141 0x8D 10001101 205 0xCD 11001101
14 0x0E 00001110 78 0x4E 01001110 142 0x8E 10001110 206 0xCE 11001110
15 0x0F 00001111 79 0x4F 01001111 143 0x8F 10001111 207 0xCF 11001111
16 0x10 00010000 80 0x50 01010000 144 0x90 10010000 208 0xD0 11010000
17 0x11 00010001 81 0x51 01010001 145 0x91 10010001 209 0xD1 11010001
18 0x12 00010010 82 0x52 01010010 146 0x92 10010010 210 0xD2 11010010
19 0x13 00010011 83 0x53 01010011 147 0x93 10010011 211 0xD3 11010011
20 0x14 00010100 84 0x54 01010100 148 0x94 10010100 212 0xD4 11010100
21 0x15 00010101 85 0x55 01010101 149 0x95 10010101 213 0xD5 11010101
22 0x16 00010110 86 0x56 01010110 150 0x96 10010110 214 0xD6 11010110
23 0x17 00010111 87 0x57 01010111 151 0x97 10010111 215 0xD7 11010111
24 0x18 00011000 88 0x58 01011000 152 0x98 10011000 216 0xD8 11011000
25 0x19 00011001 89 0x59 01011001 153 0x99 10011001 217 0xD9 11011001
26 0x1A 00011010 90 0x5A 01011010 154 0x9A 10011010 218 0xDA 11011010
27 0x1B 00011011 91 0x5B 01011011 155 0x9B 10011011 219 0xDB 11011011
28 0x1C 00011100 92 0x5C 01011100 156 0x9C 10011100 220 0xDC 11011100
29 0x1D 00011101 93 0x5D 01011101 157 0x9D 10011101 221 0xDD 11011101
30 0x1E 00011110 94 0x5E 01011110 158 0x9E 10011110 222 0xDE 11011110
31 0x1F 00011111 95 0x5F 01011111 159 0x9F 10011111 223 0xDF 11011111
32 0x20 00100000 96 0x60 01100000 160 0xA0 10100000 224 0xE0 11100000
33 0x21 00100001 97 0x61 01100001 161 0xA1 10100001 225 0xE1 11100001
34 0x22 00100010 98 0x62 01100010 162 0xA2 10100010 226 0xE2 11100010
35 0x23 00100011 99 0x63 01100011 163 0xA3 10100011 227 0xE3 11100011
36 0x24 00100100 100 0x64 01100100 164 0xA4 10100100 228 0xE4 11100100
37 0x25 00100101 101 0x65 01100101 165 0xA5 10100101 229 0xE5 11100101
38 0x26 00100110 102 0x66 01100110 166 0xA6 10100110 230 0xE6 11100110
39 0x27 00100111 103 0x67 01100111 167 0xA7 10100111 231 0xE7 11100111
40 0x28 00101000 104 0x68 01101000 168 0xA8 10101000 232 0xE8 11101000
41 0x29 00101001 105 0x69 01101001 169 0xA9 10101001 233 0xE9 11101001
42 0x2A 00101010 106 0x6A 01101010 170 0xAA 10101010 234 0xEA 11101010
43 0x2B 00101011 107 0x6B 01101011 171 0xAB 10101011 235 0xEB 11101011
44 0x2C 00101100 108 0x6C 01101100 172 0xAC 10101100 236 0xEC 11101100
45 0x2D 00101101 109 0x6D 01101101 173 0xAD 10101101 237 0xED 11101101
46 0x2E 00101110 110 0x6E 01101110 174 0xAE 10101110 238 0xEE 11101110
47 0x2F 00101111 111 0x6F 01101111 175 0xAF 10101111 239 0xEF 11101111
48 0x30 00110000 112 0x70 01110000 176 0xB0 10110000 240 0xF0 11110000
49 0x31 00110001 113 0x71 01110001 177 0xB1 10110001 241 0xF1 11110001
50 0x32 00110010 114 0x72 01110010 178 0xB2 10110010 242 0xF2 11110010
51 0x33 00110011 115 0x73 01110011 179 0xB3 10110011 243 0xF3 11110011
52 0x34 00110100 116 0x74 01110100 180 0xB4 10110100 244 0xF4 11110100
53 0x35 00110101 117 0x75 01110101 181 0xB5 10110101 245 0xF5 11110101
54 0x36 00110110 118 0x76 01110110 182 0xB6 10110110 246 0xF6 11110110
55 0x37 00110111 119 0x77 01110111 183 0xB7 10110111 247 0xF7 11110111
56 0x38 00111000 120 0x78 01111000 184 0xB8 10111000 248 0xF8 11111000
57 0x39 00111001 121 0x79 01111001 185 0xB9 10111001 249 0xF9 11111001
58 0x3A 00111010 122 0x7A 01111010 186 0xBA 10111010 250 0xFA 11111010
59 0x3B 00111011 123 0x7B 01111011 187 0xBB 10111011 251 0xFB 11111011
60 0x3C 00111100 124 0x7C 01111100 188 0xBC 10111100 252 0xFC 11111100
61 0x3D 00111101 125 0x7D 01111101 189 0xBD 10111101 253 0xFD 11111101
62 0x3E 00111110 126 0x7E 01111110 190 0xBE 10111110 254 0xFE 11111110
63 0x3F 00111111 127 0x7F 01111111 191 0xBF 10111111 255 0xFF 11111111

Практичні межі видно одразу: 0x7F = 127 = 01111111, а 0x80 = 128 = 10000000. Саме перехід між цими значеннями змінює старший біт з 0 на 1.

Як це пов’язано з MIDI 1.0

Актуальна MIDI Association reference table показує status bytes у діапазоні 0x80–0xFF як 8-бітні значення зі старшим бітом 1, а Control Change data bytes — як значення 0–127 зі старшим бітом 0. Це і є практична причина, чому в MIDI-коді часто одночасно бачимо повні bytes 128–255 і data values 0–127.

Практичний приклад

Повідомлення Note On для ноти Middle C з velocity 100 можна записати так:

  • decimal: 144, 60, 100;
  • hex: 0x90, 0x3C, 0x64;
  • binary: 10010000, 00111100, 01100100.

Тому в MIDI-коді hex часто зручний для status bytes, а decimal — для значень, які люди звикли рахувати як 0–127.

Джерела