
시간 다루기 - metro, counter, clocker
metro로 박자를 만들고, counter로 숫자를 세고, BPM과 ms 변환 공식으로 음악적 타이밍을 구현합니다.
이 에피소드에서 배우는 것
- metro로 일정 간격의 반복 이벤트 만들기
- counter로 숫자 세기
- clocker로 경과 시간 측정하기
- BPM과 ms의 관계 이해하기
사전 지식
metro - 메트로놈
음악을 만들려면 반드시 “시간”을 다룰 수 있어야 한다. 리듬, 템포, 시퀀싱 모두 시간의 흐름 위에서 만들어지기 때문이다. Max에서 시간의 흐름을 만드는 가장 기본적인 오브젝트가 바로 [metro]이다.
[metro 500]은 500밀리초(0.5초)마다 bang을 출력하는 메트로놈이다. 이 bang을 다른 오브젝트에 연결하면, 0.5초 간격으로 반복되는 이벤트를 만들 수 있다.
metro에 1(또는 bang)을 보내면 시작되고, 0을 보내면 멈춘다. toggle 오브젝트를 metro의 입력에 연결하면 클릭 한 번으로 시작과 정지를 전환할 수 있어 편리하다.
시간 단위는 기본적으로 밀리초(ms)를 사용하지만, Hz나 Max의 시간 구문(예: 4n = 4분음표)으로도 입력할 수 있다.
BPM과 ms의 관계
음악에서 템포를 표현할 때는 BPM(Beats Per Minute)을 사용한다. BPM 120이란 1분에 120번의 박자가 있다는 뜻이다.
BPM을 ms로 변환하는 공식은 간단하다:
ms = 60000 / BPM
BPM 120인 경우: 60000 / 120 = 500ms (4분음표 하나의 길이)
여기서 다른 음표의 길이를 구할 수 있다:
- 8분음표 = 500 / 2 = 250ms
- 16분음표 = 500 / 4 = 125ms
- 32분음표 = 500 / 8 = 62.5ms
ms를 Hz로 변환하는 공식은:
Hz = 1000 / ms
500ms = 1000 / 500 = 2Hz
이 변환은 LFO(Low Frequency Oscillator)에서 템포와 동기화된 변조를 만들 때 유용하다.
counter - 숫자 세기
[counter]는 bang을 입력받을 때마다 숫자를 하나씩 세는 오브젝트이다. metro와 함께 사용하면 시간에 따라 순차적으로 증가하는 숫자를 만들 수 있다.
[counter 0 7]은 0에서 7까지 세고, 다시 0으로 돌아가서 반복한다. 이것은 8스텝 시퀀서의 기본 구조이기도 하다. 상행(올라가기)과 하행(내려가기) 모두 가능하며, 세 번째 Inlet으로 카운트 방향을 전환할 수 있다.
counter의 세 번째 Outlet은 카운트가 한 바퀴를 완료하고 처음으로 돌아갈 때 bang을 출력한다. 이를 “캐리(carry)“라고 부르며, 더 큰 단위의 카운터를 연결할 때 사용한다.
clocker - 경과 시간 측정
[clocker]는 시작 시점부터 현재까지 흘러간 시간을 ms 단위로 알려주는 오브젝트이다. 녹음 시간을 표시하거나, 특정 이벤트 사이의 간격을 측정하는 데 유용하다.
핵심 오브젝트 정리
| 오브젝트 | 역할 | 사용 예 |
|---|---|---|
[metro] | 일정 간격으로 bang 출력 | 시퀀서, 타이머, 리듬 |
[counter] | bang마다 숫자 카운트 | 스텝 시퀀서, 인덱스 |
[clocker] | 경과 시간(ms) 측정 | 타이머, 녹음 시간 |
[toggle] | On/Off 스위치 | metro 제어 |
직접 해보기
[metro 500]→[counter 0 3]→[print]를 연결하여 0~3이 반복되는 것을 확인하자- BPM을 입력하면 4분음표, 8분음표, 16분음표의 ms 값을 계산하는 패치를 만들어보자
- ms를 Hz로 변환하는 패치도 추가해보자
다음 에피소드 예고
다음 에피소드에서는 Max에서 조건에 따라 데이터의 흐름을 나누는 방법을 배운다. if, select, route 오브젝트를 사용한 분기 처리를 알아본다.
자주 묻는 질문
BPM 120에서 16분음표 길이는 몇 ms인가요?
125ms입니다. 계산 과정은 다음과 같습니다. BPM 120은 1분에 4분음표가 120개 있다는 뜻이므로 4분음표 하나 = 60000 / 120 = 500ms. 16분음표는 4분음표를 4등분한 것이므로 500 / 4 = 125ms. 일반화하면 16분음표 ms = 60000 / BPM / 4 입니다. 이 값을 [metro]에 넣으면 정확히 16분음표 간격으로 bang이 발사됩니다.
metro를 시작하고 멈추는 방법은 무엇인가요?
metro의 첫 번째 Inlet에 1을 보내거나 bang을 보내면 시작되고, 0을 보내면 멈춥니다. 가장 편리한 방법은 [toggle] 오브젝트를 metro 앞에 연결하는 것입니다. toggle은 클릭할 때마다 0과 1을 번갈아 출력하므로 한 번 클릭으로 시작·정지를 토글할 수 있습니다. 또한 metro의 시간 인자는 ms 외에 '4n' 같은 음표 표기, 'Hz' 단위 등도 받습니다.
metro와 clocker는 무엇이 다른가요?
[metro]는 "일정한 간격으로 반복해서 bang을 출력하는 메트로놈"이고, [clocker]는 "시작 순간부터 현재까지 흘러간 시간을 ms 단위로 알려주는 스톱워치"입니다. 시퀀서나 LFO처럼 주기적인 이벤트를 만들 때는 metro를, 녹음 시간 표시나 두 이벤트 사이의 간격을 측정할 때는 clocker를 사용합니다. clocker를 시작·정지하려면 1과 0을, 리셋하려면 [reset] 메시지를 보냅니다.
counter에서 carry/overflow는 무엇인가요?
counter의 세 번째(가장 오른쪽) Outlet에서 발생하는 신호로, 카운트가 최댓값에 도달해 다시 시작값으로 돌아가는 순간 bang이 출력됩니다. 예를 들어 [counter 0 7]은 0,1,2…7을 세고 다시 0으로 돌아갈 때 carry bang을 발사합니다. 이를 다른 counter의 입력에 연결하면 "8스텝마다 1씩 증가하는 더 큰 카운터"를 만들 수 있어 16스텝 → 4마디 같은 계층적 시간 구조를 구현할 수 있습니다. 두 번째 Outlet은 반대로 underflow(최솟값에서 다시 최댓값으로 회귀할 때) 신호입니다.
이 에피소드가 도움이 됐다면 눌러주세요.
공식 문서 참조
YouTube
채널에서 더 많은 Max/MSP 예제를 이어서 보세요
튜토리얼의 흐름을 끊지 않고, 실제 영상 데모와 채널 콘텐츠를 연속해서 확인할 수 있습니다.