DSP Tutorial – Audio Rate와 Control Rate

Max/MSP (이하 Max로 통일)을 사용하다보면 Max 오브젝트와 MSP 오브젝트들의 처리방식에 대한 차이를 정확히 이해하지 못하는 경우가 생기곤 한다.

특히 [metro] 와 같은 오브젝트를 사용하여 시퀀싱을 하는 등 타이밍과 직결된 문제들을 해결하려 할때 중요한 개념 중 하나가 Audio Rate와 Control Rate이다.


Vector Size

Audio Rate란 무엇인가? 이는 MSP오브젝트들이 데이터를 주고 받는 속도를 의미한다. 이것을 이해하기 위해서는 우선 Max의 오디오 상태창을 먼저 확인할 필요가 있다.

Max의 오디오 상태창

샘플레이트, I/O Vector Size 그리고 Signal Vector Size를 확인해보자. 이 세가지가 현재 나의 Max의 MSP 오브젝트가 데이터를 처리하는 방식을 정의내린다.

다른 디지털 오디오 소프트웨어와 마찬가지로 Max 또한 오디오 데이터를 처리하기 위해 버퍼(Buffer)를 사용한다. 버퍼는 오디오 인터페이스로 전달될 데이터 컨테이너를 뜻하며, 동시에 오디오 데이터가 입/출력되는 속도를 결정하는데, Max에서는 이를 Vector라는 이름으로 부르는 것이다.

I/O Vector 크기는 [adc~], [dac~], [ezadc~], [ezdac~]과 같은 오디오 인터페이스와 데이터를 주고받는 오브젝트들이 보내는 데이터의 대역폭을 말한다.

샘플링 속도가 44100hz일때 벡터 사이즈가 512Sample이라면 Max는 오디오 데이터를 입출력하는 주기가 512/44100초, 즉 0.0116초마다 오디오 인터페이스와 512샘플 크기의 데이터를 주고받는다는 뜻이 된다.

벡터 사이즈가 줄어들수록 데이터를 주고받는 주기는 짧아지고 이는 곧 CPU에 더 많은 부하를 가하는 결과를 낳는다.

Signal Vector(신호 벡터) 는 무엇일까? 이는 MSP 오브젝트가 교환하는 버퍼의 크기를 말한다. 현재 Max의 신호 벡터 크기는 4로 되어있는데, 이는 오브젝트간 주고받는 데이터의 크기가 4 Sample이라는 뜻이며, 4/44100s 의 속도로 전송된다고 할 수 있다.

시퀀싱 등 샘플 레벨의 정확도가 필요한 패치를 디자인한다면 시그널 벡터 사이즈를 좀 더 작게 줄일 필요가 있고, 아니라면 사이즈를 좀 더 키워서 CPU 프로세싱 파워의 오버헤드를 키워줄 수도 있다. 

따라서 현재 MSP 오브젝트가 데이터를 주고받는 속도, 이것을 Audio Rate라고 부른다.


Control Rate vs. Audio Rate

다음으로 Max 및 MSP가 데이터를 처리하는 방식을 비교해보자.

두 수를 더하는 동작을 Max 오브젝트인 [+ ]와 MSP 오브젝트 [+~ ] 를 통해 처리하였다.

Max 오브젝트의 경우 오브젝트 오른쪽에 위치한 Cold Inlet(파란색으로 표시)에 먼저 데이터를 집어넣고 왼쪽의 Hot Inlet(빨간색)으로 나머지 숫자 2가 입력되었을 때 7이라는 값이 출력된다.

반면 MSP에서는 양쪽 Inlet이 모두 Hot Inlet으로 표시된 것을 볼 수 있다. 다만, 명심해야할 것은 Max내에서 처리되는 어떤 데이터도 동시에 처리되지 않는다는 것이다.

MSP에서 데이터가 처리되는 것은 패처 내의 DSP의 동작 유무에 따라 결정되는데, MSP 시그널이 동시에 처리되는것처럼 보이는 것은 이 데이터들이 Audio Rate에 따라 처리되기 때문이다.

일반적으로 Max 오브젝트가 처리하는 신호들은 Video, MIDI, DMX, Serial 통신, OSC, UDP 데이터 등 오디오보다 상대적으로 느린 신호들이며, 이를 처리하는 속도를 Control Rate라고 부른다.

기본적으로 Max 오브젝트들은 밀리초(ms) 단위의 처리 속도를 가지게 된다. 

[metro] 오브젝트는 ms 뿐만 아니라 Hz 단위로 속도를 설정할 수 있다.

[metro]를 고속으로 작동시켜서 bang을 보내야 하는 많은 경우중 하나는 비디오 재생을 위해 Jitter 오브젝트에 bang을 전달해야할 때가 대표적이다.

이 경우 metro가 bang을 보내는 속도는 1000/60초, 즉 16.67ms로 Audio Rate에 비해 현저히 느린 속도인 것을 알 수 있다.

이를테면 모니터 주사율이 144hz를 지원하고 이에 맞게 bang을 내보낸다 해도 1000/144초, 약 6.944ms이다.

자세히 보면 램프는 직선을 그리지 않고 계단 현상을 동반한다.

실제로 [line]과 같은 오브젝트로 선형적인 램프를 생성하다 보면 당연하게도 매끄러운 곡선이 아닌, 에일리어싱을 동반한 거친 형태의 선이 그려진다.

이는 모든 데이터가 전송되는 속도가 Control Rate에 맞춰져 있기 때문이다.

마찬가지로 Max 데이터를 MSP 도메인으로 변환하는 [sig~], MSP 데이터를 측정하는 [snapshot~]도 마찬가지로 ms 단위의 측정 속도인 Control Rate에 맞춰서 처리된다.

정확한 Clocking을 위하여

이러한 이유로 인해 Max for Live 디바이스를 이용해 아르페지에이터 등을 제작할때, metro를 이용해 타이밍을 계산해서 노트를 생성할 경우 실제 Live의 트랜스포트와 정확히 동기화되지 않고 지연되는 것을 볼 수 있다.

이 경우 보다 정확한 타이밍 계산을 위해서는 오디오 도메인에서 계산할 필요가 있으며 이를 샘플 단위로 정확한 클럭(sample-accurate clock)이라고 부른다.

Max가 제공하는 샘플 정확도의 두가지 클럭

샘플 정확도의 클럭을 만들기 위해 사용되는 오브젝트는 일정 주기의 램프를 Audio Rate에 맞춰 생성하는 [phasor~] 오브젝트이다.

만일 Live의 트랜스포트와 동기화된 phasor를 사용하고싶다면 Max for Live 에디터에서[plugphasor~]를 사용해야 한다.

Max 8.3 업데이트를 통해 시그널을 이용한 시퀀싱이 보다 쉬워지게 만드는 오브젝트 [what~]이 업데이트 되었는데, MSP 시그널을 이용한 시퀀싱에 대해선 다른 에피소드에서 다룰 예정이다.


참고 문서

다른 DSP Tutorial 읽기