max와 ableton live를 같이 쓰면서 가장 아쉬웠던건, live의 knob, slide, plugin parameter….등등을 audio rate로 컨트롤 하기….였습니다. 미리 프로그램 되어진 parameter들(예를 들면 ‘Auto Filter’의 LFO)을 제외하면 audio rate로 컨트롤하는건 불가능이었습니다.
영상에서처럼 Max For Live를 이용하면 됩니다. 잘 됩니다. live의 거의 모든 parameter들을 audio rate로 컨트롤할 수 있습니다.
jit.window 오브젝트에 몇 개의 이미지를 슬라이드 쇼 처럼 보여준다고 가정해 봅시다. 이 때 이미지들이 부드럽게 cross-fade 되는 것이, 갑자기 변해 가는 것보다 훨씬 더 좋아 보일 것입니다. 이미지들을 OpenGL의 texture로 사용하는 상황에서도 역시, cross-fade는 필수적인 요소입니다.
그러나 Jitter에서 이를 구현하는 것은 생각보다 쉽지 않습니다. 자동으로 해주면 좋으련만 Max에서 그냥 저절로 얻어지는 고차원의 기능이 있던가요?
그래서 이를 위한 패치를 만들어 보았습니다. 이 패치는 저희 작품에서 부드러운 화면 전환을 위해 종종 쓰이던 것입니다. 패치의 핵심 부분은 다음과 같이 되어 있습니다:
생각보다는 간단하죠? 이 패치에서 1번 인렛에는 matrix를, 2번 인렛에는 fade 시간을 넣어주게 되어 있습니다.
결국 jit.xfade 오브젝트를 이용한 것입니다. matrix가 들어올 때 마다 왼쪽과 오른쪽 인렛에 번갈어 넣어주면서 xfade 값을 정해진 시간 동안 이동시키는 방식입니다.
“jit.matrix 3 float32 2 2″는 해당 무비파일의 keystone을 위한 vertex를 생성합니다. 4개의 꼭지점(2*2 dim)과 x,y,z 좌표(3 planes)가 저장됩니다. “jit.expr @expr nore[0] 1-norm[1]“은 무비파일을 texture로 입힐때 필요한 texcoord를 생성합니다. “p cellBlocks”을 이용하면 데이터들을 눈으로 확인 가능합니다.
“umenu”에서 무비파일을 선택하면 해당 무비파일에 한해서만 shift, control, option, command + click을 이용하여 keystone조절이 가능합니다.
두개 이상의 무비파일을 사용한다면 “jit.gl.mesh,” “jit.qt.movie”와 “umenu”의 item을 더 늘려주면 됩니다. 그 다음 message box로, 예를 들면 texture mov3, texture mov4……식으로 더 만들어 줍니다.
Jitter를 사용하시는 대부분의 분들은 jit.window 오브젝트에 ‘fullscreen 1 ‘ 메시지를 보내면 전체화면이 된다는 것을 아실 것입니다.
만약 Dual Display 상태라면, 전체화면을 만들고 싶은 디스플레이로 윈도우를 옮긴 후 위 메시지를 보내면 됩니다. 이는 저희가 공연에서 주로 사용하는 방법으로, Mac Pro 등에 모니터와 프로젝터를 연결하고, 모니터는 패치를 콘트롤하는 등의 용도로, 프로젝터는 jit.window를 전체화면으로 하여 결과물을 관중들에게 보여주는 용도로 쓰는 방식이죠.
그런데 공연 당일은 그렇다치더라도, 패치를 만드는 과정에서는 하나의 디스플레이에서 전체화면을 시뮬레이션 해 봐야 하는 경우가 종종 있게 되죠. 그리고 이 때, 특히 Mac을 쓸 때는 메뉴바와 독(Dock), 그리고 커서가 매우 방해가 됩니다.
이를 손쉽게 해결하기 위해 제가 흔히 쓰는 방법을 하나 소개해 드리고자 합니다.
보통 전체화면을 on/off 시키기 위해 ESC 키를 많이 이용하는데, 저는 여기에 Shift 키를 더하여 사용할 수 있도록 만듭니다. 그냥 ESC를 눌렀을 때는 메뉴바와 커서가 보이는 채로 전체화면을 만들고, Shift-ESC를 눌렀을 때는 메뉴바와 커서를 감추고 전체화면을 만드는 것이죠. (전체화면에서 다시 돌아올 때는, 그냥 ESC 만 다시 누르면 됩니다.)
이는 다음과 같은 간단한 패치로 쉽게 구현이 가능합니다.
물론 이 방법이 최선의 방법은 아니겠지만, 아직까지는 매우 만족하는 방식이라 여러분들과 함께 나눠봅니다.
지난 번 글에 올려드린 패치를 좀 더 다듬어 조그마한 나무 블럭에 프로젝션을 해 보았습니다.
글자가 정말 떠오르는 것 같은가요? 아마도 뭔가 어색함을 느끼실 것입니다. 그 어색함은 다음 두 가지 정도로 요약할 수 있을 것 같습니다.
떠오르는 글자가 너무 평면적입니다. 이 글자는 조금의 흔들림도 없이 아주 정직하게 공중부양을 합니다. 또한, 3차원적인 물체가 아닌 점도 어색함의 원인입니다.
이 영상을 찍은 카메라의 각도가 떠오르는 글자의 움직임의 각도와 조금 어긋납니다. 즉, 관중의 시점이 떠오르는 글자의 각도와 어긋나면 어색함을 느낀다는 이야기입니다. 대부분의 프로젝션 매핑이 관중과 멀리 떨어지거나 높은 건물에 위치하는 이유는 아마도 이런 문제 때문일 것입니다.
아뭏든 이를 해결할 수 있는, 관중을 속일 수 있는(?) 그럴듯한 방법들을 찾아야 할 것 같습니다.
Tacit Group의 작품은 대부분 컴퓨터 여러 대의 네트워킹으로 만들어집니다. 예를들면, 저희 작품 중 Game Over는 5~6명의 연주자, 그리고 프로젝션과 사운드를 위한 서버 컴퓨터로 구성이 됩니다. 총 7대의 컴퓨터는 UDP를 통해 서로 데이터를 주고 받게 되어 있습니다.
이를 위해 Max의 udpsend와 udpreceive 오브젝트를 사용하고 있는데, 중요한 것은 데이터의 양이 많아질수록 대단히 심각한 문제가 생길 수 있다는 점입니다.
몇 번의 Game Over 연주에서 부딪힌 문제점 중 하나는 6명의 연주자가 보내는 데이터들이 서버 컴퓨터로 모였을 때, 네트웍의 과부하가 걸려 서로 싱크가 맞지 않는 점이었습니다. 이로인해 각 악기들의 박이 서로 맞지 않거나, 게임 알고리즘이 뒤엉켜버리는 경우가 종종 발생했습니다.
최근 이 문제를 해결하기 위해 여러가지 실험을 하게 되었는데, 결국은 다음과 같은 결론을 얻게 되었습니다.
보내는 쪽에서, 데이터는 최대한 많이 모아서 한꺼번에 보낸다. (적은 양의 데이터를 여러 번에 나눠서 보내는 것보다, 많은 양의 데이터를 한번에 보내는 것이 더 효율적입니다.)
받는 쪽에서는, 버려도 될 데이터들(예를들면 영상 데이터)과 버려서는 안 될 데이터를 구분하고, 버려도 될 데이터들은 jit.qball이나 qmetro 등을 통해서 처리한다. (이 오브젝트들은 데이터 양이 감당하지 못할 정도로 많이 날라올 때 자동으로 데이터를 버립니다.)
물론, 이 두가지 원칙은 간단해 보이지만 실제로는 구현하기 난해할 수 있습니다. 하지만, 부드러운 네트워킹을 위해서는 꼭 넘어야 될 산입니다.