Interactive Art/Max_Interactive and Digital Arts

Module 4 - Working with Video in Max

Gamestonk118 2022. 10. 20. 17:01

Working with Images and Video Playback

지금까지 기본적으로 Max가 어떻게 작동되는지에 대해 알아보았다. 이제부턴 본격적으로 각각의 object들의 작은 값들이 비디오 파일들 즉 영상을 접근하는데 있어 어떠한 역할을 할지에 대해 알아볼 것이다. 지금까지 Max의 기본적인 것들만 알았다면 이제는 드디어 Jitter로 접근하여 영상쪽으로 Max가 어떠한 방식으로 작동하는지에 대해 알 수 있을 것이다.

 

Things to learn in this class

- Load videos and images into Max. (비디오와 이미지 Max로 불러오기.)

- Display videos and images in a patcher window. (patcher window에서 video와 images 디스플레이 하기.)

- Conveniently switch between files. (파일들 변경 간편하기 하기.)

- Use UI objects (or MIDI control inputs) to affect the playback of the files. (파일들의 재생들에게 작용시킬 수 있는 UI Object혹은 MIDI 컨트롤 input 사용하기.)

- Shift numbers from one range to another using the scale objects. (scale object사용하여 숫자들 range를 조정하기.)

- Mix (or crossfade) between visual inputs to produce a blend of two images. (두 다른 이미지들의 혼합물을 생성하기 위한 시각적 input들을 섞어보기.)

- Add simple visual effects to images. (이미지들에게 간단한 시각효과를 적용해보기.)

 

jit.movie

jit.movie는 생각보다 파워풀한 object으로써 다른 object들하고 다르게 하나 이상의 기능을 하게 된다. jit.movie에 들어가는 argument들은 각기 재생하려는 비디오의 width와 height을 나타냄으로써 차원들의 크기를 조절해준다 (e.g. jit.movie 640 360). 이때 jit.movie에서 특정 movie 파일을 읽게끔 세팅하기 위해서는 read라는 message를 생성하여 연결을 해주어야 한다. read 를 누르게 되면 컴퓨터 안에 있는 어떤 미디어 파일을 재생시킬건지 창이 뜨게 되는데 알맞는 파일을 선택하여 Max로 불러오게끔 세팅하면 된다. 만약 미디어 파일에 사운드가 있다면 불러오자마자 오디오가 재생되는 것을 알 수 있을 텐데 이는 stop 이라는 message를 생성하여 jit.movie inlet에 연결하여 클릭했을때 미디어 파일 재생이 일시중시 되게끔 만들어 줄 수 있다. 

 

jit.movie에 read message를 연결하여 원하는 미디어 파일을 Max로 불러올 수 있게끔 하는 세팅

 

그렇다면 오디오가 나오는 것은 이해를 하였는데 과연 그렇다면 어떻게 미디어 파일을 Max Patcher안에서 시각적으로 볼 수 있을까? 이는 jit.movie의 왼쪽 inlet인 bang을 통해 현재 재생되고 있는 프레임을 결과 정보로써 내보낼 수 있다. 이 때 bang을 가장 간편하게 생성할 수 있는 방법은 qmetro object이다. qmetro는 기본적으로 @interval attribute를 써넣어여주어야 하며 이는 영상 파일의 FPS (Frame Per Second) 즉 초당 몇프레임이 재생될지 정해주는 역할을 해준다. 이는 특정 프레임에 연속적인 모션을 세팅하여 주고 싶을때 아주 유용하게 활용될 수 있다. 이때 중요하게 알아야 할 사실은 이 값을 줄인다고 미디어 파일의 재생 속도에도 변화를 준다는 것은 아니다. 이는 단지 초당 프레임이 얼마나 나올지 (즉 뚝뚝 끊겨져서 나올지 아니면 부드럽게 나올지) 설정해주는 값이지 영상 길이 전체에 전반적인 변화를 준다는 의미가 아니다. 

또한 아래에썬 send object을 사용하여 영상 파일을 내보내는 역할을 하였다. 이는 recieve object으로 받아와 나중에 알아볼 윈도우 창을 생성해주는 object으로 연결하면 본격적으로 비주얼 자료들을 시각적으로 볼 수 있다. 이때 send object은 딱히 outlet의 연결 없이 멀리 떨어져 있는 (심지어 다른 탭에 있는) recieve object으로 불러와 생성시킬 수 있다. 이 때 중요한점은 sendrecieve안에 들어가는 argument의 단어들이 같아야 각기 내포하는 동일한 파일들을 불러와야 한다 (e.g. send movie -> recieve movie).

 

jit.movie에 read와 qmetro를 연결하여 시각적으로 25hz로 동영상이 재생되게끔 세팅하였다.

 

이때 qmetro가 아닌 일반적인 metro도 있는데 이 두 object들의 차이점은 qmetro는 CPU의 성능에 따라 object들의 작동이 빨라질 경우 jit.movie의 bangs 즉 현재 재생되는 프레임을 결과값으로 내보내는 속성의 우선순위를 낮추게 된다. 보다 안정적이고 변수 없이 CPU에 무리가 가지 않는 비디오를 재생하기 위해서는 metro를 사용하여 일정한 속도로 영상이 재생되게끔 세팅해야 하는데 만약 CPU에 무리가 가는 영상을 재생할 경우 qmetrometro와 다르게 일정한 속도로 유지하려고 하여 처리 대기열이 밀리려고 할때 시각적 결과를 내보내는 과정을 다른 과정들이 먼저 처리되고 실행되게끔 만들어 준다. 그럼으로 인해 CPU 의 부하를 줄이기 위해서는 주로 다양한 jit.movie나 각기 다른 시각적 material들을 Max에서 디스플레이 할때에는 qmetro를 사용하는 습관이 좋다.

 

ㅇmetro 와 qmetro의 차이점

 

jit.pwindow

jit.pwindow는 Max에서 본격적으로 시각적인 미디어 파일들을 직접적으로 디스플레이 해주는 UI Object으로써 attribute로써 @size와 각기 width와 height을 써 넣어주면 해당 사이즈의 맞는 window창을 생성시켜 준다 (e.g. jit.pwindow @size 640 360). 

 

위에서 read message로 가져온 영상 파일을 send object으로 옮겨 recieve로 받아 jit.pwindow에서 시각적으로 나타나게끔 설정하였다.

 

Max에서 영상파일을 활용하여 작업할 때 중요하게 알아야 할 사실은 만일 다른 탭으로 옮기거나 하더라도 영상파일은 멈추지 않는다는 사실이다. 이는 각기 탭에 영향을 서로 주지 않도록 구분하거나 각기 탭에 기능들을 배포하거나 할때의 특징으로써 작동할 수 있지만 때로는 불편하게 느껴질 수 있다. 이는 영상뿐만 아니라 사운드에도 똑같이 적용되어 각기 탭에 여러개의 notein으로 생성시킨 사운드 생성이 있을 경우 다른 탭으로 이동한다고 이전 탭의 사운드가 멈추는 것이 아닌 계속 재생되어 결국은 여러개의 사운들을 듣게 된다는 점이 있다. 이를 조절하기 위해서는 Max에서 message를 다른 위치로 선택적으로 라우팅할 수 있는 몇 가지 object들을 세팅해주어야 한다. 이는 다음 시간에 더욱 깊게 알아보기로 하였다. 

 

또한 Max에서는 patch의 연결을 disable하려고 할 때 다음과 같이 진행이 가능하다. Unlocked patcher에서 Patch Cord 즉 object들끼리 연결된 선을 클릭한 다음 우클릭하여 Disable Patch Cord를 선택하면 일시적으로 해당 Patch Cord의 작동을 불가하게 만들어 줄 수 있다. 

 

Disable Patch Cord를 선택하여 해당 Patch Cord를 작동 불가하게 만들어 주는 방법.

 

Messages to jit.movie

jit.movie는 기본적으로 message들을 연결하여 작동하는 데 (마치 jit.movie의 inlet에 read message를 연결했던 것처럼) 이때 크게 연결되는 message안에 들어가는 속성들은 두 가지로 분류될 수 있다. 

  • the thing we want to change (우리가 바꾸고 싶은 것들)
  • the value we want to change it to (우리가 변경하려는 값)

예를 들면 만약 비디오의 다른 프레임을 재생시키고 싶으면 frame 82라는 message를 연결하여 클릭했을 때 해당 프레임으로 이동하게끔 만들어 줄 수 있다. 반면 또한 비디오를 다시 처음부터 재생시키고 싶을때 time 0 이라는 message를 연결하여 클릭했을때 첫 장면부터 다시 재생하게끔 만들어 줄 수 있다. 이 때 vol이나 time_secs와 같은 메세지들은 integer값을 받지 않는다. 이 때 float 값을 number box로 생성시키기 위해서는 F키를 클릭하거나 number box의 inspector에 들어가 Display Format 카테고리를 Decimal로 바꾸어 소숫점들을 받아들이는 number box를 생성해 줄 수 있다.

아래 사진에서 볼수 있는 time_secs 다음으로 들어가는 $1은 정해진 값이 아닌 아래 사진처럼 time_secs 값을 Number box로 유동적으로 바뀌게끔 세팅하고 싶을때 특정 값 대신 changable (변경 가능한) 이라는 의미로써 넣어줄 수 있다.

 

jit.movie에 연결되는 Message들의 종류들은 다음과 같다.
인스펙터에서 Display Format값안에 있는 number box 속성을 변경하여 Integer에서 floating number box로 변경할 수 있다.

 

jit.movie object을 조절해주는 message들의 종류는 다음과 같은데 이들의 특징을 정리하자면 다음과 같다.

 

read jit.movie으로 집어넣을 미디어 파일들을 불러와주는 역할을 한다.
start jit.movie으로부터 생성되는 미디어 파일들을 재생시켜주는 역할을 한다.
stop jit.movie으로부터 생성되는 미디어 파일의 재생을 일지중지시켜주는 역할을 한다.
frame jit.movie안 미디어 파일의 재생할 특정 프레임을 설정해주는 역할을 한다.
rate jit.movie안 미디어 파일의 재생되는 속도를 설정해주는 역할을 한다.
loop jit.movie안 미디어 파일의 마지막 프레임이 끝났을때 다시 처음 프레임부터 반복시켜주는 역할을 한다.
time_secs jit.movie안 미디어 파일의 재생할 특정 초당 타임 좌표를 설정해주는 역할을 한다.
vol jit.movie안 미디어 파일의 사운드 볼륨을 설정해주는 역할을 한다.
getrate 해당 미디어 파일의 rate값을 나타내어 준다. (print @popup과 같은 object이 있으면 patcher상에서 확인 가능하다.)
getvol 해당 미디어 파일의 volume값을 나타내어 준다. (print @popup과 같은 object이 있으면 patcher상에서 확인 가능하다.)
getframecount 해당 미디어 파일의 전체 프레임 수를 나타내어 준다. (print @popup과 같은 object이 있으면 patcher상에서 확인 가능하다.)
gettime_secs 해당 미디어 파일의 현재 scene이 진행되고 있을때의 시간대를 나타내어 준다. (print @popup과 같은 object이 있으면 patcher상에서 확인 가능하다.)

 

Messages with $ placeholders

아마 jit.movie를 사용하는 순간이 올때 jit.movie안에 특정 값을 조절하게 만들어 유동적으로 원하는 방향의 영상 파일 재생을 추구하는 순간이 올 것이다. 이때 앞서 언급했듯이 message를 연결하여 특정 프레임이나 타임 아니면 속도 등을 조절할 수 있는데 이때 더욱 편하게 UI Object을 사용하여 Message안에 들어가는 값을 조절하고 싶을때는 $1을 대신 써넣어 가능하게 만들어 줄 수 있다. $1는 들어오는 첫번째 값을 기존의 값에서 대채한다는 것을 의미하는데 이는 마치 후디니 Vex에서의 ch() function이라고 이해하면 쉽다. 일종의 파라미터를 만들어 주어 값을 조절해 줄 수 있다는 것이다. 

 

RGB 값에 B값을 $1로 설정하여 bgcolor 즉 Background Colour값의 파란색값을 Slider로 유동적으로 조절할 수 있게끔 할 수 있다.

 

만약 각기 여러개에 있는 값들을 따로 따로 조절하고 싶을때에는 $1부터 $9까지 세팅하여 유동적으로 값을 조절할 수 있게끔 만들어 줄 수 있다. 이때 message에서의 첫번째 값인 1은 $1으로 설정되어 변경될 수 있게끔 하고 두번째 값인 2는 $2로 변경되어 조절될 수 있게 만들어주는 방식의 원리이다.

이때 명심해야 할 사실은 $1에서 $9과 같은 $가 붙은 모든 것들은 message 안에서만 사용가능하며 다른 object들의 argument로 사용하지 못한다는 점을 알아야 한다.

각기 $1에서 부터 $9까지 들어오는 값들의 순서에 따라 받음으로써 전부다 각기 다른 number box로 다시 조절 가능하게끔 만들었다.

 

jit.movie Attributes

Attribute들도 또한 특정 object이 어떻게 커스터마이징 될지 설정해주는 수단으로써 argument와는 다르게 object이 작동되기 위해 필요한 필수적인 요소는 아니다. attribute는 argument 다음에 써넣어야 하며 또한 attribute를 쓸 때 그들간 끼리의 순서는 상관이 없다. 예를 들어 jit.movie으로부터 영상을 재생시킬때 불러오자마자 start message를 클릭할 필요없이 재생되는 것을 알 수 있다. 이는 jit.movie object안에 @autoplay라는 attribute이 기본적으로 세팅되어있기 때문인데 만약 자동재생을 원하지 않는다면 특정 attribute를 추가하여 원하는 대로 object의 속성들을 조절할 수 있다. 이 때 위에서 언급한것과 같이 message에서 jit.movie file에 특정한 부분을 바꾼것 처럼 attribute을 통해 message없이 object상으로도 가능한데 이는 다음과 같은 예시들과 같다.

 

jit.movie @engine viddle jit.movie object의 엔진을 avf (기본값)에서 viddle로 바꾸어라.
jit.movie @autostart 0  jit.movie로부터 불러오는 파일을 불러오자마자 재생되지 않게끔 설정. start message를 눌러서만 재생 가능하게끔 세팅하는 방법이다.
jit.movie @vol 0 jit.movie로부터의 미디어 파일의 사운드를 0으로 설정하여 영상 파일안에 있는 기본적은 사운드가 안나오게끔 설정하는 방법이다.
jit.movie @rate 0.5 jit.movie의 미디어 파일의 속도를 0.5로 설정하여 반쯤 느리게 가도록 설정하여라.
jit.movie @moviefile mymovie.mp4 jit.movie가 자동적으로 영상 파일을 불러오게끔 만들어주는 attribute이다. 이때 무조건 불러오려는 영상파일이 해당 patcher .maxpat파일과 동일한 폴더 안에 있어야 한다.

 

아래와 같이 qmetro에 다음과 같은 attribute를 설정하여 보았다. 이는 @interval를 통해 1초에 5번 qmetro가 button에게 bang을 전달하고 @active를 통해 자동으로 켜지게끔 설정하였다. 

이와 같이 patch를 설정하면 button이 자동으로 깜빡깜빡 하게되는 것을 볼 수 있다.

 

이러한 attribute는 다음과 같이 한곳에 여러개 뭉쳐져서 쓸 수 있으며 재차 말하지만 attribute간의 순서는 중요하지 않다. 

 

jit.movie 안에 여러개의 attribute을 한곳에 모아 다 써넣어보았다.

 

Scaling Number Ranges

앞서 보았겠지만 jit.movie를 향한 message들은 특정 range (범위)를 가지게 된다. 이 때 UI Object을 사용하여 message값을 파라미터로써 조절하고 싶을때 우리가 기본적인 range가 아닌 우리가 필요하다고 생각되는 range로 조절하여 바꾸어 줄 수있다. 몇몇의 objects들은 그들의 인스펙터를 통해 range를 조절해줄 수 있는데 더욱 간편한 방법을 사용하려면 scale object을 사용할 수 있다. 

 

인스펙터를 통해 slider의 range를 조절하는 방법

 

아니면 다음과 같이 scale object을 사용하여 range를 조절할 수 있는데 이때 중요한 사실은 scale object안에 들어가는 argument들로 총 네 개의 값을 써 넣어주어야 한다. 이는 Vex에서의 fit() Function과 매우 유사한데 minimum input, maximum input, 그리고 minimum output, 그리고 maximum output을 각기 집어넣어주면 된다. 이 때 minimum input과 maximum input은 각기 변경하려는 기본적인 range값 그리고 minimum output과 maximum output은 변경하고자 하는 원하는 range값을 집어넣어야 한다. 이를 통해 integer 값에서 float 값들의 range로 변경도 가능하다. 

아래 사진에서 integer range 0-127 사이의 range값을 0.0에서 1.0 즉 float range값으로 변경한 것을 알 수 있다.

 

0과 127사이의 있는 82라는 값은 0.0과 1.0사이에 있는 값으로 변경되어 0.646과 같은 결과를 나타내는 것을 알 수 있다.

 

jit.xfade

jit.xfade는 두 개의 다른 미디어 소스들을 믹스하는 역할을 하는 object이다. 이는 비디오가 jit.pwindow 창에서 변경될때 스무스하게 transition되는 것을 생성해줄 수 있다. jit.xfade는 각기 두 개의 jit.movie object들을 각각의 inlet에 연결하여 첫번째 inlet에 xfade와 같은 message를 연결하여 얼마나 두 소스가 섞일지 (어떤 영상파일이 우선적일지) 조절할 수 있다. 이 때 첫번째 소스는 jit.xfade에서 0으로 설정되고 두번째 소스는 1로 설정된다. 그러므로 0과 1사이의 값을 조절함으로써 두 영상이 공존하여 재생되는 미디어 파일을 내보낼 수 있다. 만약 0과 1사이의 range를 넘는다면 한 미디어 파일이 밝아지는 것을 알 수 있다. (예를 들어 0이하로 값을 내리면 0에 해당하는 미디어 파일이 밝아지고 1이상으로 값을 올리면 1에 해당하는 미디어 파일이 밝아진다.)

 

jit.xfade를 통해 xfade의 message값을 조절하였을때 영상의 파일들이 서로 transition되는것을 알 수 있다.

 

jit.brcosa

jit.brcosajit.movie로부터 생성되는 미디어 파일의 시각 효과들을 조절할 수 있게 하는 Object이다. jit.brcosajit.movie아래 연결되며 이를 직접적으로 jit.pwindow에 연결하여 결과물을 생성시킬 수 있다. 이를 통해 fades, desaturation, contrast와 같은 여러가지 효과들을 생성시켜 더욱 다채롭게 영샹을 꾸며줄 수 있다. 이 때 jit.brcosa가 인식할 수 있는 가장 대중적인 message들은 다음과 같으며 이들은 각기 모든 기본값으로 1을 가진다.

 

brightness 영상 파일의 밝기를 조절해준다. 이를 통해 fade-in이나 fade-out을 만들어 줄 수 있다.
contrast 영상 파일의 색상 대비를 조절해준다. 이를 통해 어두운 부분은 더 어둡게 밝은 부분은 더 밝게 만들어 줄 수 있다.
saturation 영상 파일의 채도를 조절해준다. 이를 통해 미디어 파일의 색상을 더욱 색상으로 진하게 만들거나 값을 떨어뜨려 흑백으로 만들 수 있다.

 

jit.brcosa와 같은 Object을 통해 영상의 각기 다른 시각효과들을 적용해볼 수 있다.

 

Bring Media Files

영상을 불러올때는 다음과 같은 사이트를 통해 무료 영상 소스들을 배급받을 수 있다. 하지만 Comment 안에 해당 영상 파일의 URL과 Credit이 담긴 Reference를 작성하는 것을 잊지 않아야 한다. 또한 프로젝트를 만들 때 각기 object들 옆에 comment를 붙여 이 object이 어떠한 역할을하고 왜 이러한 object들을 골랐는지 그리고 어떠한 이유로 새로운 Number Range로 변경하였는지에 대해 간략히 설명하는 습관도 아주 좋은 습관이므로 겸하는 것이 좋다. (프로그래밍에서 나나 팀원들이 알기 쉽게 Comment를 작성하여 주석을 남기는 것과 같은 원리이다.)

https://www.pexels.com/videos/

 

이때 중요한 사실은 Max 프로젝트를 어딘가 업로드 할 때 무조건 필수적으로 영상 파일도 같이 .maxpat파일과 함께 한 폴더에 업로드 해야 Max Patcher에서 해당 영상 파일을 읽을 수 있다.

 

지금까지 Jitter의 대한 기본적인 방식에 대해 알아보았다. 영상을 다루는데 있어 생각보다 Max는 아주 유용한 기능들을 제공하는 것 같다. 다음시간에는 MSP에 대해 살펴보아 음향쪽으로 Max가 파일을 불러와 어떠한 방식으로 커스터마이징 기능을 제공해 줄 수 있는지에 대해 알아볼 것이다.