Season 02 · EP10 MIDI 데이터 해부 - Note, CC, Program Change 썸네일
← 튜토리얼Season 02 · EP10 · MIDI 프로그래밍

MIDI 데이터 해부 - Note, CC, Program Change

MIDI 케이블을 흐르는 0과 1. Status Byte와 Data Byte, Note On/Off/CC/Program Change 등 주요 메시지의 구조를 해부합니다.

난이도: 초급 예상 시간:

이 에피소드에서 배우는 것

  • MIDI가 물리적으로 데이터를 전송하는 방식
  • Byte, Bit의 개념과 MIDI에서의 데이터 범위(0-127)
  • Status Byte와 Data Byte의 구분 원리
  • Note On/Off, CC, Program Change, Pitch Bend, Aftertouch 각 메시지의 구조

사전 지식

  • EP09: MIDI의 탄생 - CV에서 디지털로

MIDI의 물리적 전송

MIDI 케이블 안에서 데이터는 어떻게 흐를까? MIDI는 전기적으로 매우 단순한 시스템이다. 두 가지 전압 상태만 사용한다.

  • +5V = 1 (High)
  • 0V = 0 (Low)

이 두 상태의 조합으로 모든 음악 정보를 표현한다. 이것이 바이너리(Binary, 2진법) 전송이다. MIDI의 전송 속도는 31,250 baud(초당 31,250비트)로, 1983년 기준으로는 충분했지만 현대 기준으로는 상당히 느린 편이다. 이 속도 제한이 후에 MIDI 2.0이 등장하게 된 이유 중 하나이기도 하다.

Byte와 Bit

MIDI 데이터의 기본 단위를 이해하려면 Byte와 Bit 개념이 필요하다.

Bit(비트): 0 또는 1, 디지털 데이터의 최소 단위이다.

Byte(바이트): 8개의 Bit가 모인 것. 1 Byte = 8 Bit.

8비트로 표현할 수 있는 경우의 수는 2^8 = 256가지, 즉 0부터 255까지이다. 그런데 MIDI에서 실제로 사용하는 데이터 범위는 0부터 127까지, 128가지뿐이다. 왜 절반만 쓸까?

Status Byte vs Data Byte

MIDI는 바이트를 두 종류로 구분한다. 그 구분 기준은 8비트 중 **맨 앞 비트(MSB, Most Significant Bit)**이다.

  • Status Byte: MSB = 1 (1xxxxxxx) → 128~255 범위. “이것은 명령이다”라는 신호.
  • Data Byte: MSB = 0 (0xxxxxxx) → 0~127 범위. “이것은 값이다”라는 신호.

Data Byte는 맨 앞 비트가 항상 0으로 고정되므로, 실제 데이터에 사용할 수 있는 비트는 나머지 7개뿐이다. 2^7 = 128, 따라서 0~127이 MIDI 데이터의 기본 범위가 된다. MIDI에서 “127”이라는 숫자가 반복적으로 등장하는 이유가 바로 이것이다.

Status Byte는 메시지의 종류와 채널 정보를 담는다. 상위 4비트가 메시지 종류, 하위 4비트가 채널 번호(0~15, 표시상 1~16)를 나타낸다.

MIDI 메시지의 전체 구조

MIDI 메시지 분류 트리 — Channel Messages (voice, mode)와 System Messages (real time, common, SysEx)로 크게 나뉜다

MIDI 메시지 중 가장 많이 사용되는 것이 Voice Message이다. 실제 음악 연주 정보를 담고 있는 메시지들이다.

Note On / Note Off

건반을 누르고 떼는 동작을 표현하는 가장 기본적인 메시지이다.

Note On 메시지는 3바이트로 구성된다.

[Status: 1001nnnn] [Data1: Pitch] [Data2: Velocity]
  • Status Byte: 1001 + 채널번호(4비트)
  • Data Byte 1 (Pitch): 어떤 음인가. 0~127. MIDI 60 = Middle C(C4), MIDI 69 = A4(440Hz)
  • Data Byte 2 (Velocity): 얼마나 세게 눌렀는가. 0~127. 값이 클수록 강하게 연주한 것.

Note Off 메시지도 동일한 3바이트 구조이다.

[Status: 1000nnnn] [Data1: Pitch] [Data2: Velocity]

여기서 중요한 관례가 하나 있다. Velocity 0인 Note On은 Note Off로 취급된다. 실제로 많은 MIDI 장비가 별도의 Note Off 메시지 대신 Velocity 0의 Note On을 보낸다. 전송 효율을 위한 선택이다.

MIDI Pitch 번호와 음이름의 대응 관계는 다음과 같다.

MIDI Number음이름주파수 (Hz)
21A027.5
60C4 (Middle C)261.6
69A4440.0
127G912543.9

Polyphonic Key Pressure (Poly Aftertouch)

건반을 누른 상태에서 추가로 압력을 가했을 때, 각 건반별로 개별 압력 값을 전송하는 메시지이다.

[Status: 1010nnnn] [Data1: Pitch] [Data2: Pressure]

건반 하나하나에 압력 센서가 필요하므로 구현 비용이 높아, 이 기능을 지원하는 키보드는 고급 기종에 한정된다.

Control Change (CC)

신시사이저의 노브, 슬라이더, 페달 등 다양한 컨트롤러의 값을 전달하는 메시지이다.

[Status: 1011nnnn] [Data1: CC Number] [Data2: Value]
  • CC Number (0~127): 어떤 컨트롤러인가
  • Value (0~127): 현재 값

자주 사용되는 CC Number는 관례적으로 정해져 있다.

CC Number용도설명
1Modulation Wheel비브라토 등 모듈레이션
7Channel Volume채널 볼륨
10Pan좌우 패닝 (64 = 중앙)
11Expression표현력 볼륨
64Sustain Pedal서스테인 페달 (0-63 = Off, 64-127 = On)

CC 메시지는 MIDI에서 가장 범용적인 메시지로, 현대에는 DAW의 오토메이션이나 하드웨어 컨트롤러의 매핑에 광범위하게 활용된다.

Program Change

악기의 프리셋(음색)을 전환하는 메시지이다. 다른 Voice Message와 달리 2바이트만 사용한다.

[Status: 1100nnnn] [Data1: Program Number]
  • Program Number (0~127): 128가지 프리셋 중 하나를 선택

General MIDI 규격에서는 각 Program Number에 대응하는 악기가 정해져 있다. 예를 들어 0번은 Acoustic Grand Piano, 24번은 Nylon Guitar이다. 이에 대해서는 다음 에피소드에서 자세히 다룬다.

Channel Aftertouch (Channel Pressure)

건반을 누른 상태에서 추가 압력을 가했을 때, 채널 전체에 하나의 압력 값을 전송하는 메시지이다. Polyphonic Key Pressure와 달리 건반별 개별 값이 아닌 채널 전체의 대표값을 보낸다.

[Status: 1101nnnn] [Data1: Pressure]

Poly Aftertouch보다 데이터 양이 적어 구현이 쉽고, 대부분의 중급 이상 키보드가 지원한다.

Pitch Bend

피치 휠을 돌릴 때 전송되는 메시지이다. 다른 메시지와 달리 14비트 해상도를 가진다.

[Status: 1110nnnn] [Data1: LSB] [Data2: MSB]

왜 14비트일까? 7비트(0~127)로는 피치 변화를 매끄럽게 표현하기에 해상도가 너무 낮다. 128단계로 반음 사이를 이동하면 계단 현상이 들릴 수 있기 때문이다. 그래서 MIDI 설계자들은 Pitch Bend에 한해 Data Byte 2개를 합쳐 14비트를 사용하기로 했다.

  • 범위: 0 ~ 16,383 (2^14 = 16,384 단계)
  • 중앙값: 8,192 (피치 변화 없음)
  • 0: 최대 하향
  • 16,383: 최대 상향

기본적으로 Pitch Bend의 범위는 위아래 2반음이지만, 수신측 설정에 따라 범위를 변경할 수 있다.

MIDI 메시지 요약

메시지Status (상위 4bit)Data Byte 수설명
Note Off10002음 끄기
Note On10012음 켜기
Poly Key Pressure10102건반별 압력
Control Change10112컨트롤러 값
Program Change11001음색 전환
Channel Aftertouch11011채널 압력
Pitch Bend11102피치 휠 (14bit)

핵심 용어 정리

용어설명비고
Bit0 또는 1, 디지털 최소 단위-
Byte8 Bit의 묶음1 Byte = 8 Bit
Status Byte메시지 종류 + 채널 (MSB = 1)128~255
Data Byte실제 값 (MSB = 0)0~127
Velocity건반을 누르는 세기0 = Note Off로 취급
CC (Control Change)컨트롤러 파라미터 값 전달128종류의 컨트롤러
Pitch Bend14bit 고해상도 피치 변화중앙값 8192

직접 해보기

  1. MIDI Note Number 72는 어떤 음이름에 해당하는가? Middle C(60)로부터 12반음 위이므로 한 옥타브 위의 C, 즉 C5이다. 같은 방식으로 MIDI 48, 55, 67이 각각 어떤 음인지 계산해보자.
  2. CC 7(Volume)의 값이 100일 때와 CC 10(Pan)의 값이 0, 64, 127일 때 각각 어떤 상태인지 설명해보자.
  3. Pitch Bend 값 8192는 중앙(변화 없음)이다. 만약 Pitch Bend 범위가 +-2반음이라면, 값 0과 16383은 각각 현재 음에서 몇 반음 이동한 상태인가?

다음 에피소드 예고

다음 에피소드에서는 이론으로 배운 MIDI 메시지를 Max에서 직접 다룬다. midiin으로 MIDI 데이터를 받고, midiparse로 분리하고, noteout으로 소리를 내는 실습을 진행한다.

자주 묻는 질문

  • MIDI 값은 왜 0~255가 아니라 0~127까지만 쓰나요?

    MIDI는 한 바이트(8비트)에서 가장 앞 비트(MSB, Most Significant Bit)를 "이 바이트가 명령인지(1) 값인지(0)" 구분하는 데 씁니다. 그래서 실제 데이터 표현에는 7비트만 남고 2^7 = 128, 즉 0~127 범위가 됩니다. 이 1비트의 구분 덕분에 수신측은 스트림에서 메시지 시작점을 즉시 인식할 수 있고, 노트·벨로시티·CC 같은 값들이 모두 0~127로 통일된 이유가 여기에 있습니다.

  • Note On이지만 Velocity가 0이면 어떻게 처리되나요?

    Velocity 0인 Note On 메시지는 Note Off로 취급됩니다. 실제로 많은 MIDI 장비가 별도의 Note Off(1000nnnn) 대신 Velocity 0의 Note On(1001nnnn)을 보내는데, 이는 "러닝 스테이터스(Running Status)"라는 최적화와 잘 맞기 때문입니다. 같은 Status Byte가 반복될 때 Status Byte를 생략할 수 있어 전송 효율이 올라갑니다. 따라서 Max에서 Note Off를 처리할 때는 Note Off 메시지뿐 아니라 Velocity 0의 Note On도 함께 고려해야 하며, [stripnote] 오브젝트가 이 처리를 담당합니다.

  • Pitch Bend는 왜 14비트를 쓰나요?

    피치를 0~127의 128단계로만 표현하면 반음 사이를 나누는 해상도가 너무 낮아 계단 현상(stepping)이 들리기 때문입니다. MIDI 설계자들은 Pitch Bend에 한해 Data Byte 두 개(LSB + MSB)를 합쳐 14비트(0~16,383)를 쓰도록 정했고, 중앙값 8192가 "피치 변화 없음"입니다. 이 16,384단계 해상도 덕분에 ±2반음(기본값) 범위 내에서도 매끄러운 글라이드가 가능해집니다. Pitch Bend는 LSB가 먼저, MSB가 나중에 전송된다는 점도 다른 메시지와 다른 특이점입니다.

  • MIDI Note Number와 음이름 사이의 관계는 어떻게 되나요?

    MIDI Note 60이 Middle C(C4), 69가 A4(440Hz)로 가장 자주 기준이 됩니다. 옥타브가 올라가면 Note Number가 12씩 증가하므로 C4=60, C5=72, C6=84이고, 같은 옥타브 안에서는 반음마다 1씩 증가합니다(C=60, C#=61, D=62...). MIDI Note → 주파수 변환 공식은 frequency = 440 × 2^((note-69)/12)이며 Max에서는 [mtof] 오브젝트가 이 계산을 처리합니다. MIDI 0은 C-1, 127은 G9이며 피아노의 88 건반은 21(A0)~108(C8) 범위에 해당합니다.

공식 문서 참조

YouTube

채널에서 더 많은 Max/MSP 예제를 이어서 보세요

튜토리얼의 흐름을 끊지 않고, 실제 영상 데모와 채널 콘텐츠를 연속해서 확인할 수 있습니다.

카톡 문의