Season 02 · EP11 Max에서 MIDI 다루기 - midiin, midiparse, noteout 썸네일
← 튜토리얼Season 02 · EP11 · MIDI 프로그래밍

Max에서 MIDI 다루기 - midiin, midiparse, noteout

midiin/midiparse/stripnote/makenote/noteout/mtof/kslider 핵심 오브젝트 사용법과 MIDI 키보드로 사인파 신스를 연주하는 워크숍.

난이도: 초급 예상 시간:

이 에피소드에서 배우는 것

  • Max에서 MIDI 데이터를 수신하고 분석하는 방법
  • MIDI 관련 핵심 오브젝트 6종의 역할과 사용법
  • General MIDI 규격과 내장 소프트웨어 신시사이저
  • MIDI 입력으로 사인파 신시사이저를 제어하는 첫 번째 워크숍

사전 지식

  • EP09: MIDI의 탄생
  • EP10: MIDI 데이터 해부

MIDI 데이터 수신: midiin

[midiin]은 MIDI 장치로부터 RAW(가공되지 않은) MIDI 데이터를 받는 오브젝트이다. 컴퓨터에 연결된 MIDI 키보드, MIDI 컨트롤러, 또는 다른 소프트웨어에서 보내는 MIDI 데이터를 Max 패치 안으로 끌어들이는 입구 역할을 한다.

midiin의 출력은 숫자의 나열이다. 건반을 하나 누르면 세 개의 숫자가 연속으로 출력된다(Status Byte, Pitch, Velocity). 이 숫자들이 바로 EP10에서 배운 MIDI 바이트들이다. 하지만 이 상태로는 어떤 숫자가 Pitch이고 어떤 숫자가 Velocity인지 구분하기 어렵다.

midiin에 인자(Argument)를 주지 않으면 Max의 MIDI 설정에서 지정된 기본 입력 장치를 사용한다. 특정 장치를 지정하려면 [midiin "장치 이름"] 형태로 사용하거나, 더블클릭하여 인스펙터에서 장치를 선택한다.

MIDI 데이터 분리: midiparse

[midiparse]는 midiin이 내보낸 RAW 바이트 스트림을 메시지 종류별로 분리해주는 오브젝트이다. midiin의 출력을 midiparse의 입력에 연결하면, 각 Outlet에서 정돈된 데이터가 나온다.

midiparse의 Outlet은 왼쪽부터 순서대로 다음과 같다.

Outlet출력 내용형식
1 (왼쪽)NotePitch Velocity 쌍
2Poly AftertouchKey Pressure 쌍
3Control ChangeCC번호 Value 쌍
4Program ChangeProgram번호
5Channel AftertouchPressure 값
6Pitch Bend0~16383
7 (오른쪽)Channel메시지의 채널 번호

예를 들어 건반을 누르면 첫 번째 Outlet에서 60 100처럼 두 숫자가 나온다. 60은 Pitch(Middle C), 100은 Velocity이다. 건반을 떼면 60 0이 나온다. Velocity 0은 Note Off를 의미한다.

Note Off 필터링: stripnote

[stripnote]는 Note On 메시지만 통과시키고 Note Off(Velocity = 0)를 걸러내는 오브젝트이다.

왜 Note Off를 걸러내야 할까? 많은 상황에서 “건반이 눌린 순간”에만 관심이 있고 “건반이 떼어진 순간”은 필요 없다. 예를 들어 건반을 누를 때마다 시각적 이벤트를 트리거하거나, 새 음을 할당하는 경우가 그렇다.

stripnote에는 두 개의 입력(Pitch, Velocity)과 두 개의 출력(Pitch, Velocity)이 있다. midiparse의 Note 출력을 stripnote에 연결하면, Velocity가 0이 아닌 Note On 메시지만 통과한다.

Note 쌍 생성: makenote

[makenote]는 Note On 메시지를 받으면 지정된 시간 후에 자동으로 대응하는 Note Off를 생성하는 오브젝트이다. 프로그래밍으로 MIDI 노트를 만들 때 필수적이다.

[makenote 100 500]
  • 첫 번째 인자 100: 기본 Velocity
  • 두 번째 인자 500: Duration(지속 시간, 밀리초 단위)

왼쪽 Inlet에 Pitch 값(예: 60)을 보내면, 즉시 60 100(Note On)을 출력하고, 500ms 후에 60 0(Note Off)을 출력한다.

makenote가 없다면 Note On을 보낸 후 적절한 시점에 직접 Note Off를 보내야 한다. 이를 잊으면 음이 영원히 울리는 “stuck note” 현상이 발생한다. makenote는 이 문제를 자동으로 해결해준다.

세 개의 Inlet은 각각 다음을 제어한다.

  • In1 (왼쪽): Pitch (이 Inlet에 값이 들어올 때 출력이 트리거됨)
  • In2 (중앙): Velocity
  • In3 (오른쪽): Duration (ms)

MIDI 출력: noteout

[noteout]은 Max에서 외부 MIDI 장치 또는 소프트웨어 신시사이저로 Note 메시지를 전송하는 오브젝트이다.

세 개의 Inlet이 있다.

  • In1 (왼쪽): Pitch (0~127)
  • In2 (중앙): Velocity (0~127)
  • In3 (오른쪽): Channel (1~16)

noteout에 장치를 지정하지 않으면 시스템 기본 MIDI 출력을 사용한다. macOS에서는 DLS Synth(또는 Apple DLS Synth)라는 내장 소프트웨어 신시사이저가 기본 설정되어 있고, Windows에서는 Microsoft GS Wavetable Synth가 기본이다.

주파수 변환: mtof

[mtof]는 MIDI Note Number를 주파수(Hz)로 변환하는 오브젝트이다. 이름은 “MIDI to Frequency”의 약자이다.

변환 공식은 다음과 같다.

frequency = 440 × 2^((midi_note - 69) / 12)

MIDI 69 = A4 = 440Hz를 기준으로, 반음 하나당 2의 1/12제곱만큼 주파수가 변한다. 이 공식은 EP09에서 배운 V/Oct의 지수적(Exponential) 관계와 동일한 원리이다.

MIDI Number음이름mtof 출력 (Hz)
57A3220.0
60C4261.6
69A4440.0
72C5523.3
81A5880.0

mtof의 역변환 오브젝트는 [ftom](Frequency to MIDI)이다.

GUI 키보드: kslider

[kslider]는 화면에 피아노 건반을 표시하는 GUI 오브젝트이다. MIDI 키보드가 없어도 마우스 클릭으로 음을 입력할 수 있다.

kslider에는 두 개의 Outlet이 있다.

  • Out1 (왼쪽): Pitch
  • Out2 (오른쪽): Velocity

kslider를 클릭하면 Pitch와 Velocity가 순서대로 출력되므로, 곧바로 makenote나 noteout에 연결할 수 있다. MIDI 키보드 없이 패치를 테스트할 때 매우 유용하다.

General MIDI

General MIDI(GM)는 1991년에 제정된 MIDI의 확장 규격으로, 음색 배치를 표준화한 것이다.

Roland Sound Canvas SC-88 Pro — 1990년대 General MIDI 음원 모듈의 상징

핵심 내용은 다음과 같다.

  • 128개 프로그램(음색): Program Number 0~127에 대응하는 악기가 고정되어 있다
    • 0: Acoustic Grand Piano
    • 24: Nylon Guitar
    • 32: Acoustic Bass
    • 48: String Ensemble
    • 73: Flute
    • 등등
  • 16채널: 하나의 MIDI 포트에서 16개 채널을 동시에 사용할 수 있다
  • 채널 10 = 타악기 전용: 채널 10에서는 각 Pitch가 서로 다른 타악기 소리에 매핑된다
General MIDI 128개 음색 전체 매핑표 — Program Number 1부터 128까지 악기 이름이 표준화되어 있다 GM Standard Drum Map — 채널 10에서 MIDI Pitch가 어떤 드럼 소리에 매핑되는지 보여준다 (35=Bass Drum, 38=Snare, 42=Closed Hi-Hat 등)

macOS의 DLS Synth와 Windows의 GS Wavetable Synth는 모두 General MIDI 규격을 따른다. 따라서 noteout의 채널을 10으로 설정하면, Pitch 값에 따라 다양한 타악기 소리를 낼 수 있다.

Workshop: My First Synthesizer

지금까지 배운 MIDI 오브젝트와 EP03에서 배운 MSP 오브젝트를 결합하여, MIDI 키보드로 사인파 신시사이저를 연주해보자.

MIDI 입력 → midiparse → stripnote → mtof → cycle~ → line~ envelope → ezdac~ 체인의 실제 Max 패치

패치 구조는 다음과 같다.

[midiin]
  |
[midiparse]
  |  (첫 번째 Outlet: Pitch Velocity)
[stripnote]
  |  (Pitch만)
[mtof]
  |  (주파수)
[cycle~]
  |
[gain~]
  |
[ezdac~]
  1. [midiin]으로 MIDI 데이터를 받는다
  2. [midiparse]의 첫 번째 Outlet에서 Note 정보를 분리한다
  3. [stripnote]로 Note Off를 걸러낸다 (Note On만 통과)
  4. [mtof]로 Pitch 번호를 주파수로 변환한다
  5. [cycle~]에 주파수를 넣어 사인파를 생성한다
  6. [gain~][ezdac~]로 출력한다

MIDI 키보드가 없다면 [kslider]를 midiin 대신 사용하면 된다. kslider의 Pitch 출력을 mtof에 연결하면 동일한 결과를 얻는다.

이 패치의 한계는 명확하다. Note Off를 처리하지 않으므로 마지막에 누른 음이 계속 울리고, 한 번에 하나의 음만 낼 수 있다(모노포닉). 하지만 MIDI 입력이 소리로 변환되는 전체 과정을 한눈에 보여주는 최소한의 구현이다.

핵심 오브젝트 정리

오브젝트역할비고
[midiin]RAW MIDI 데이터 수신바이트 스트림 출력
[midiparse]MIDI 메시지 종류별 분리7개 Outlet
[stripnote]Note Off 필터링Velocity 0 제거
[makenote]Note On/Off 쌍 자동 생성Duration 지정 (ms)
[noteout]MIDI Note 출력Pitch, Velocity, Channel
[mtof]MIDI Number → 주파수 변환69 → 440Hz
[ftom]주파수 → MIDI Number 변환mtof의 역변환
[kslider]GUI 피아노 건반마우스 입력

직접 해보기

  1. Workshop의 My First Synthesizer 패치를 직접 만들어보자. cycle~ 대신 [saw~]이나 [rect~]를 연결하면 어떤 소리가 나는지 비교해보자.
  2. noteout의 채널을 10으로 설정하고, number box로 36, 38, 42 등의 Pitch를 보내보자. General MIDI 타악기 소리를 확인할 수 있다.
  3. midiparse의 세 번째 Outlet(CC)에 number box 두 개를 연결하고, MIDI 컨트롤러의 노브를 돌려보자. CC Number와 Value가 어떻게 변하는지 관찰해보자.

다음 에피소드 예고

다음 에피소드에서는 Max의 강력한 데이터 처리 도구를 배운다. pack, trigger, zl 시리즈를 사용하여 여러 값을 하나의 리스트로 묶고, 실행 순서를 제어하고, 리스트를 자르고 정렬하는 방법을 익힌다.

자주 묻는 질문

  • MIDI 키보드를 연결했는데 Max가 인식하지 않습니다.

    다음 순서로 점검합니다. (1) Options → MIDI Setup을 열어 키보드가 입력 목록에 보이는지 확인. 안 보이면 USB 연결을 다시 꽂거나 macOS의 Audio MIDI Setup 앱에서 인식 여부 확인. (2) [midiin]을 더블클릭해 인스펙터에서 사용할 장치를 명시적으로 선택. (3) 다른 앱(Logic, Live 등)이 MIDI 장치를 점유 중이면 Max가 받지 못할 수 있으니 닫고 재시도. (4) [midiin] 대신 [kslider]를 두고 클릭해서 패치 자체가 동작하는지 격리 테스트.

  • [stripnote]는 정확히 무엇을 거르나요?

    Velocity가 0인 노트 메시지를 통과시키지 않고 차단합니다. EP10에서 봤듯 많은 MIDI 장비가 별도의 Note Off 대신 "Velocity 0의 Note On"을 보내는 관례를 따르므로, 이를 거르지 않으면 "건반을 뗄 때" 무음(Velocity 0)인 음이 트리거되어 의도치 않은 동작이 생깁니다. 시퀀서·아르페지에이터처럼 "건반이 눌린 순간"에만 반응해야 하는 구조에서는 stripnote가 필수입니다.

  • macOS의 DLS Synth와 Windows의 GS Wavetable Synth는 무엇인가요?

    각 운영체제에 내장된 기본 소프트웨어 신시사이저로, 둘 다 General MIDI 1.0 규격을 따릅니다. [noteout]에 별도의 출력 장치를 지정하지 않으면 macOS는 DLS(Apple DLS Synth), Windows는 Microsoft GS Wavetable Synth로 신호가 흘러가서 즉시 소리가 납니다. 채널 10으로 noteout을 보내면 General MIDI Drum Map에 따라 Pitch별로 다른 타악기 소리(35=Bass Drum, 38=Snare, 42=Closed Hi-Hat 등)가 재생됩니다. 음질은 좋지 않지만 "하드웨어 없이 즉시 소리를 듣는 테스트 환경"으로 매우 유용합니다.

  • [mtof]는 어떻게 동작하나요?

    MIDI Note Number를 주파수(Hz)로 변환합니다. 기준은 MIDI 69 = A4 = 440Hz이고, 공식은 frequency = 440 × 2^((note-69)/12)입니다. 반음 하나당 주파수가 2의 1/12제곱(약 1.0595배)으로 변하는 평균율 튜닝을 따릅니다. mtof는 정수 입력은 정수 노트로, 소수 입력은 마이크로톤(microtonal)으로 처리합니다. 예: 60.5 → C4와 C#4 사이의 정확히 1/4 반음 위. 역변환은 [ftom](Frequency to MIDI)입니다.

실습 패치 다운로드

Max 8 이상에서 열어주세요. 파일을 Max로 드래그하거나 더블클릭하면 실행됩니다.

공식 문서 참조

YouTube

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

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

카톡 문의