
조건문과 분기 - if, select, route
if, select, route 오브젝트로 입력 데이터에 따라 다른 동작을 수행하는 분기 처리를 배웁니다.
이 에피소드에서 배우는 것
- if 오브젝트로 조건에 따라 분기하기
- select로 특정 값에 반응하기
- route로 메시지를 라우팅하기
사전 지식
조건문이란?
프로그래밍에서 조건문은 “만약 ~라면 이것을 하고, 아니라면 저것을 하라”는 로직을 표현하는 것이다. Max에서도 입력되는 데이터에 따라 서로 다른 동작을 수행해야 하는 상황이 자주 발생한다. 예를 들어 MIDI 노트가 들어왔을 때 특정 음역대인 경우에만 소리를 내거나, 센서 값이 일정 수준을 넘었을 때만 이펙트를 활성화하는 식이다.
C 언어에서 if/else가 이렇게 생겼다:
Max에서도 동일한 로직을 [if] 오브젝트로 구현할 수 있다.
if - 범용 조건문
[if] 오브젝트는 프로그래밍 언어의 if문과 유사한 방식으로 작동한다. 입력받는 값을 비교 연산자로 검사하고, 조건이 참이면 then 출력(왼쪽 Outlet)으로, 거짓이면 else 출력(오른쪽 Outlet)으로 데이터를 보낸다.
사용할 수 있는 비교 연산자:
==(같다),!=(다르다)>(크다),<(작다)>=(크거나 같다),<=(작거나 같다)
두 가지 조건을 동시에 검사해야 할 때:
&&: 두 조건 모두 참이어야 참 (AND)||: 둘 중 하나만 참이어도 참 (OR)
복수의 조건을 연속으로 검사해야 하는 경우, if의 else 출력(오른쪽 Outlet)을 다음 if의 입력에 연결하여 cascade 구조를 만들 수 있다. 첫 번째 조건에 맞지 않으면 다음 조건으로, 그것도 맞지 않으면 또 다음 조건으로 넘어가는 식이다.
select (sel) - 특정 값 매칭
[select](줄여서 [sel])는 입력 데이터 중 지정된 값이 들어오면 해당 위치의 Outlet에서 bang을 출력하는 오브젝트이다.
[select 60 64 67]이라고 하면, MIDI 노트 60(C4)이 들어오면 첫 번째 Outlet에서 bang, 64(E4)가 들어오면 두 번째, 67(G4)이 들어오면 세 번째 Outlet에서 bang이 나온다. 지정된 값이 아닌 데이터가 들어오면 가장 오른쪽 Outlet으로 통과한다.
select는 if보다 단순하지만, 특정 값에 대한 반응을 만들 때 훨씬 간결하다. MIDI 노트에 따라 다른 소리를 트리거하거나, 키보드의 특정 키에 기능을 할당할 때 유용하다.
route - 메시지 라우팅
[route]는 리스트의 첫 번째 요소를 라벨로 사용하여, 해당 라벨에 맞는 Outlet으로 나머지 데이터를 전달하는 오브젝트이다.
예를 들어 [route pitch velocity]에 pitch 60이라는 메시지를 보내면, 첫 번째 Outlet에서 60이 출력된다. velocity 100을 보내면 두 번째 Outlet에서 100이 출력된다. 첫 번째 단어가 라벨 역할을 하고, 라벨 이후의 데이터만 통과시키는 구조이다.
route는 하나의 데이터 스트림에서 여러 종류의 메시지를 구분하여 처리해야 할 때 강력하다. OSC(Open Sound Control) 데이터를 파싱하거나, 복잡한 메시지 체계를 가진 시스템에서 데이터를 분류할 때 필수적으로 사용된다.
핵심 오브젝트 정리
| 오브젝트 | 역할 | 출력 구조 |
|---|---|---|
[if] | 조건에 따라 분기 | then(왼쪽), else(오른쪽) |
[select] / [sel] | 특정 값 매칭 시 bang 출력 | 각 값마다 Outlet + 나머지(오른쪽) |
[route] | 라벨 기반 메시지 라우팅 | 각 라벨마다 Outlet + 나머지(오른쪽) |
직접 해보기
[if $i1 > 64 then $i1 else 0]을 만들고, 다양한 숫자를 보내 결과를 확인하자[select 1 2 3]에 1, 2, 3, 4를 순서대로 보내 각 Outlet의 반응을 관찰하자- route를 사용하여
note 60,cc 1 127등의 메시지를 분류하는 패치를 만들어보자
다음 에피소드 예고
다음 에피소드에서는 난수(Random)를 다루는 방법을 배운다. random, drunk, urn 오브젝트로 예측 불가능한 값을 만들고, 이를 활용한 간단한 주사위 게임을 제작한다.
자주 묻는 질문
if, select, route 중 언제 무엇을 써야 하나요?
(1) 값을 "비교 연산"해야 하면 [if]: '60보다 크면', '범위 내인지' 같은 부등식. (2) 특정 "숫자/심볼 값과 정확히 일치"하는지만 보면 [select]: MIDI 노트 60·64·67에만 반응하는 화음 감지 등. select가 if보다 훨씬 가볍고 코드도 짧습니다. (3) 'pitch 60', 'velocity 100'처럼 "라벨이 붙은 메시지"를 종류별로 분류해야 하면 [route]: OSC, 복합 메시지 시스템 파싱에 필수입니다.
[if] 오브젝트의 문법은 어떻게 되나요?
[if 조건 then 결과1 else 결과2] 형태입니다. 입력값은 $i1(첫 번째 정수), $f1(첫 번째 소수), $s1(첫 번째 심볼) 등으로 참조합니다. 예: [if $i1 > 64 then $i1 else 0]은 입력이 64보다 크면 그대로, 아니면 0을 출력합니다. 두 입력을 비교하려면 [if $i1 > $i2 then ...] 형태로 쓰고, 두 조건은 &&(AND), ||(OR)로 결합합니다. else 절은 생략 가능하지만 명시하는 편이 디버깅에 유리합니다.
[select 60]에서 매칭되지 않는 값은 어디로 가나요?
지정된 값과 매칭되지 않는 모든 입력은 select의 가장 오른쪽 Outlet으로 그대로 통과합니다. 예를 들어 [select 60 64 67]에 70이 들어오면 첫 세 Outlet에서는 아무것도 나오지 않고 네 번째(가장 오른쪽) Outlet에서 70이 나옵니다. 이 "통과 Outlet"을 다음 [select]에 연결해 cascade 구조를 만들면 "여러 단계 매칭"을 구현할 수 있고, 매칭된 경우는 bang만, 매칭 안 된 경우는 원본 값을 그대로 받을 수 있다는 점이 select의 핵심 특징입니다.
[route]는 어떻게 동작하나요?
[route]는 입력 리스트의 첫 번째 요소를 라벨로 인식해서 매칭되는 Outlet으로 나머지 데이터를 보내는 라우터입니다. [route pitch velocity]에 'pitch 60'이 들어오면 첫 번째 Outlet으로 60만 보내고, 'velocity 100'이 들어오면 두 번째 Outlet으로 100만 보냅니다. 라벨에 매칭되지 않는 메시지는 가장 오른쪽 Outlet으로 통째로 통과합니다. 단순한 숫자 매칭은 [select], 복합 메시지의 "종류 분류"는 [route]라고 기억하면 됩니다.
이 에피소드가 도움이 됐다면 눌러주세요.
공식 문서 참조
YouTube
채널에서 더 많은 Max/MSP 예제를 이어서 보세요
튜토리얼의 흐름을 끊지 않고, 실제 영상 데모와 채널 콘텐츠를 연속해서 확인할 수 있습니다.