An introduction to controlling things with external inputs and Max's UI objects
이번 시간에 배울 것은 Max를 외부 MIDI 컨트롤러를 이용하여 물리적으로 그리고 UI (User Interface)를 사용하여 간접적으로 다루는 방법에 대해 중점을 맞추고 배워볼 것이다. 이번 단원의 컨텐츠는 Max가 어떻게 작동하는지 알려주기 위해 악보의 활용이 많을 것이다. Max는 프로그래밍 언어중 하나이지만 여기서의 핵심은 프로그래밍이 아닌 각기 다른 사운드, 비주얼, 그리고 인간-컴퓨터 상호작용을 서로 이어 이해를 돕는 방식으로 인식하면 된다.
Things to learn in this class
- Understand some of Max's conventions a little better. (Max의 관습들을 더욱 이해해보기.)
- Understand the nature of MIDI note messages in Max. (Max안에 있는 MIDI 악보 메세지들의 본질을 이해하기.)
- Understand the nature of MIDI control change messages in Max. (Max안에 있는 MIDI 컨트롤 변화 메세지의 본질을 이해하기.)
- Produce note output using the mouse and UI objects. (마우스와 UI Object들을 활용하여 악보로 생성되는 아웃풋들을 제작해보기.)
- Create a simple patch that transforms an input into a modified output. (인풋을 수정된 아웃풋으로 변화시키는 심플한 Patch를 만들어 구성해보기.)
- Use MIDI controllers or UI objects to interact with your patch. (Patch와 인터렉션을 진행할 수 있게 MIDI 컨트롤러와 UI object들을 사용해보기.)
Max's right-to-left order (again)
우리는 지난번에 Object의 'graph'를 통해 가로지르는 message들의 시행되는 순서에 대해 알아보았다. 이 때 이는 Patcher안에 있는 시각적인 message들의 배치에 따라 결정나는데 이때 유저가 특정 Object을 patch안에 어디다 두었는지에 따라 어떤 message를 우선적으로 전달하려는지 결정되기 때문이다. 보통은 patch 내부 기준으로 오른쪽에서 왼쪽을 향해 object들이 진행된다. 이 때 알아야 할 것은 여러가지의 output을 가지는 message들도 이러한 관행을 따르게 된다. 예를 들어 아래와 같이 지정된 object들을 통해 콘솔창에 각각의 수를 띄우려고 한다면 다음과 같은 결과를 내보내게 된다.

Console:

이 때 윗 사진에서 볼 수 있듯이 unpack이라고 적힌 object은 여러개의 개별 요소들이 한꺼번에 들어갔을때 쪼개주는 역할을 해준다. unpack이 내보내는 output들의 수들 즉 outlet의 수는 unpack다음에 쓰여지는 argument의 수로 결정된다. (e.g. 0 0 0 -> 세 개의 arguments). 이때 중요한 사실 두개는 다음과 같다.
- Object이 messages를 여러개의 outlet으로부터 한꺼번에 내보낼때 이들은 사실 오른쪽에서부터 왼쪽으로까지 순서대로 내보내진다.
- Max가 먼저 오른쪽에 있는 개체에 메시지를 보내는 지난 단원에서 다루웠던 내용은 하나의 outlet이 다른 많은 object들에 연결될 때에만 관련된다. 반면 여러개의 outlet에서 각기 다른 object과 연결될때는 patch안에서의 배치가 바뀌더라도 순서가 바뀌지 않는다. 그대로 outlet기준 오른쪽에서부터 왼쪽으로 나아가게 된다.
두번째 사실은 예를들어 아래와 같이 하나의 outlet에서 여러개의 object가 연결되어 있을때 이는 patch안에서 연결된 object들이 어디 배치되어있느냐에 따라 도출되는 결과값의 순서들이 달라진다. (아래의 경우 B 다음 A가 나오게 된다.)

하지만 이와 같이 여러개의 outlet들이 각각의 object들을 연결하고 있을때는 patch안에서 연결된 object들을 어디 두냐에 따라 나오는 순서가 달라지지 않는다. 이는 "Right Outlet" 이라는 print object을 젤 왼쪽에 두어도 그대로 젤 먼저 나오게 되는 결과를 나타낸다. 이는 연결하려는 Outlet이 여러개있을때에는 제일 오른쪽에 있는 outlet이 도출하는 결과가 항상 먼저 나오게되기 때문이다.


Quick Revision
지난번에 소개한 object들의 종류들을 다시한번 상기시켜 보자면 다음과 같다.
Objects - Object은 patch로부터 어떠한 액션을 취하려고 할때 제일 직접적인 담당을 도맡아서 해줄 수 있는 요소이다. Object은 숫자들을 계산하는 것부터 더욱 복잡한것들을 수행시켜줄 수 있으며 이는 사운드 파일을 재생하는 것이나 우리들에게 있어 인터렉션을 할 수 있는 수간을 제공해준다.

Numbers - Number는 다른 대상에 대해 다른 것을 의미한다. 이는 고정된 사운드, 지속시간, 혹은 "켜짐"이라는 상태를 나타내게 함으로써 활용할 수 있다. 이때 Number는 가장 큰 특징으로 Integer (정수) 값과 float (소숫점) 값으로 각기 나타낼 수 있다.

Messages - Messages는 주로 Object에 인스트럭션을 제공할 때 사용된다. 특정 Object이 이해할 수 있는 messages들을 알아보기 위해선 Object의 Inlet을 우클릭하여 Messages라는 카테고리 안의 아이템들을 살펴보면 된다.

List - List는 하나의 message안에서 여러개의 요소들을 내보 낼 수 있는 역할을 한다. List는 Message안에 여러개의 숫자들이나 단어들을 띄어쓰기로 구분하여 한꺼번에 집어넣게끔 구성되어 있으며 만드는 방법은 직접 message를 생성하여 요소들을 입력하는 방법이나 Object들이 직접 List를 제공해서 이용하는 방법을 사용할 수 있다.

Turning items into a list - pack object을 사용하면 각기 흩어져 있는 요소들을 모아서 하나의 Object안에 한꺼번에 포함되게끔 만들 수 있는데 이때 pack이라는 object의 argument를 몇번 써넣어주느냐의 따라 inlet의 갯수가 결정된다. 이는 앞서 설명한 unpack object의 argument 갯수가 outlet의 갯수와 비례하다는 것과 똑같은 원리이다.
이때 아래의 예시와 같이 object들을 구성하였을때 각각의 숫자들이 pack object으로부터 모아진 다음 message로 전달되어 버튼이 눌러졌을 때 unpack이라는 object를 통해 다시 흩어진 다음 해당되는 number box로 들어가는 것을 알 수 있다.
이때 중요한 시실은 object에 여러개의 inlet들이 있을때 본격적으로 받아들이는 inlet은 제일 좌측에 있는 것이며 Hot Inlet 이라고도 불린다. 이 때 Number box안에 있는 수들을 수정하였을때 첫 번째 number 빼고는 결과값을 불러와지지 않는 것을 알 수 있는데 두번째 그리고 세번째 number들을 message에 나타내기 위해서는 첫 번째 값을 수정했을 때 나타나지는 것을 알 수 있다. Hot Inlet 은 요소를 전달할때 제일 중심적으로 그리고 우선적으로 전달하는 Inlet으로써 여러개의 inlet이 있을때 기준이 되는 역할을 하게 된다. 그러므로 마찬가지로 Hot Inlet 으로부터 연결되어 있는 버튼이 클릭되기 전까지는 두 번째 그리고 세번째 숫자값들이 output으로 도출되지 않으며 버튼을 누르고 나서야 각각의 결과값이 뜨는 것을 알 수 있다.

Pak Object - pack은 이제 어느정도 감을 잡았겠지만 Pak은 아마 처음 보는 것일 것이다. pak은 pack의 스페셜한 버전으로써 모든 inlet들이 Hot Inlet 으로 표시된다. 그렇게 됨으로써 어느 inlet에 연결된 number이냐에 상관 없이 무조건 값을 수정하면 곧바로 전부다 결과로 도출 되어지는 것을 알 수 있다.

MIDI Note Information
유저가 만약 MIDI Keyboard를 사용하여 악보를 연주할 때 들어오는 값들을 Max상에서는 notein 이라는 object을 통해 받아줄 수 있다. notein object은 세 가지의 기본적인 outlet을 가지며 다음과 같은 정보들을 내보내준다.
- Pitch: 악보가 재생했을때의 음의 높낮이. (0에서 127까지의 range를 가진다.)
- Velocity: 악보가 재생되었을 때의 음의 볼륨. (0에서 127까지의 range를 가진다.)
- Channel: 악보가 재생되었을때의 채널들 (종류). (0에서 16까지의 range를 가진다.)
- Pitch는 말그대로 악보의 음의 높낮이를 결정해주며 0은 가장 낮고 127은 가장 높은 음을 내게 된다.
- Velocity는 악보가 재생되었을 때의 사운드의 볼륨을 결정하며 1은 가장 작고 127은 가장 큰 음을 내게 된다. 이때 특이하게도 0으로 설정하지 않으면 음악이 Max를 끌 때 까지 영원하게 재생되는데 이때 0을 입력하면 음악이 꺼지게 된다.
- Channel은 특정 악보가 어떠한 방식 즉 소리로 재생되어질지 결정하는 역할을 하게 된다. 이는 16개의 각기 다른 사운드를 가지며 이를 설정하여 더욱 풍부한 종류의 사운드 방식을 선사할 수 있다.

이 때 p notein 이라는 object을 생성하면 자동으로 음을 keyboard input을 시뮬레이션하여 알아서 음을 생성하는 것을 알 수 있다.

이 때 직접 마우스로 kslider에 있는 건반을 클릭하여 음을 생성하기 귀찮을 때 키보드를 사용하여 건반을 클릭하는 방법이 있다. 이때 p "Keyboard Piano" 라는 object을 사용하여 kslider에 연결하면 각각의 키에 해당되는 음이 나오는 것을 알 수 있다. 해당하는 키들은 아래 사진에 있다.
이때 아래 사진의 noteout object는 MIDI 음 정보를 다른 악기나 스피커로 나오게끔 하는 역할을 하게 해준다.

The Anatomy of a Note
MIDI에서는 두 개의 각기 다른 event들이 note event를 구성하는 것을 알 수 있다. 이때 알아볼 것은 note-on과 note-off인데 이들은 각기 중요한 역할을 한다.
note-on은 0이 아닌 velocity를 가진 pitch로써 앞서 언급했듯이 값이 0인 velocity를 받기 전까지는 영원히 사운드가 진행된다.
반면 note-off는 같은 음의 velocity값을 0으로 설정하여 멈추게 만들수 있다.

pgmout object은 notein에서 내보내는 channel 즉 오디오 종류를 바꿔주는 object으로써 16개중 알맞는 channel 값을 argument로 부여해줌으로써 원하는 오디오 종류를 고를 수 있다.
이 때 음에다가 시작하고 멈추고를 계속해서 명령하는 것은 힘들 수 있다. 이를 해결하기 위해 makenote object을 쓸 수 있는데 기본적으로 2개에서 3개의 argument를 집어넣어 음의 볼륨과 길이 (miliseconds) 를 각각 설정해줄 수 있다. 지정한 음의 길이를 전부 재생하고나면 makenote object은 note-off event를 시행하여 음의 velocity를 0으로 바꾸어 재생을 멈춘다.
아래의 예시를 보면 58이라는 pitch 값을 조절하여 음을 생성한다음 velocity를 120으로 잡아 볼륨을 조절하여 길이를 2000ms동안 재생되게끔 만들어 주게하였다. 이때 마지막 argument인 1은 channel을 나타냄으로써 기본적인 오디오 종류로써 나타나게끔 하였다.

Altering MIDI Input
그래서 기본적으로 음들이 어떻게 시작되고 멈추는지에 대해 간략하게 알아보았다. 이제부턴 우리가 Max를 어떠한 방식으로 정보를 제어하고 값들을 추가하는지에 대해 알아보겠다. 지난 단원에 배웠던 kslider object은 마우스로 건반을 하나하나 피아노 UI에서 클릭함으로써 음을 생성시킬 수 있었다. 이제 시행할 방법은 MIDI를 다른 방식으로 제어하는 것인데 이때 음들을 여러가지로 바꾸는 방법을 아는 것은 심플한 input에서 더욱 풍부한 output으로 내보낼 수 있으므로 매우 중요하게 작용한다. 또한 Max와 같은 비주얼 프로그래밍 언어는 일관성 있는 output을 음악적으로 뽑아내는데 아주 유용함으로 이 과정은 짚고 넘어가야 할 필요가 있다.
이 때 MIDI Input을 다음과 같이 number들로 각기 더한 다음 흩어저 있는 number box에 집어넣어 다시 makenote object으로 모아 pitch들을 특정 velocity와 length로 설정해두어 noteout object으로 음을 내보내면 kslider의 건반 하나를 눌렀을때 화음과 같은 여러개의 음을 동시에 내보낼 수 있다.

이 때 만약 화음의 대한 아이디어를 얻고 싶다면 아래 링크로 들어가 테이블 안에 p.c. #s 칼럼을 참조하여 각기 화음들을 만들때 +의 argument에 무엇을 넣을 건지 통찰력을 얻을 수 있다.
https://en.wikipedia.org/wiki/List_of_chords
List of chords - Wikipedia
From Wikipedia, the free encyclopedia Jump to navigation Jump to search The following is a list of musical chords and simultaneities: See also[edit] References[edit] <!-- NewPP limit report Parsed by mw2393 Cached time: 20221018051947 Cache expiry: 1814400
en.wikipedia.org
Percussion
일번적인 MIDI는 타악기/드럼같은 소리를 내기 위해 channel 번호 10을 사용한다. 일반적인 컴퓨터의 synthesiser는 일반적인 MIDI의 사운드세트를 이용하며 타악기 소리를 Max에서 구현하기 위해서는 notein object을 사용해 10으로 channel argument를 설정하거나 makenote object를 사용하여 또한 마찬가지로 세 번째 argument에 10을 집어넣어 타악기만 나오게끔 세팅해 줄 수 있다.
위의 pitch를 내보내어 makenote object을 통해 125의 velocity와 250ms의 길이로 설정해준다음 10으로 channel을 지정하여 타악기 종류의 오디오를 내보낼 수 있게 할 수 있다.

kslider에 있는 각기 건반에 해당하는 타악기 소리는 아래와 같다.

Control Change Events
이번 토픽에서는 ctlin object을 살펴볼 것이다. 유의해야할 점은 ctlin object은 오직 MIDI 컨트롤러가 컴퓨터에 연결되어있을때만 유용하고 오디오비주얼 미디어를 퍼포밍할때 아주 유용하게 쓰여질 것이다. 생각해보면 모든 MIDI 컨트롤러에 피아노 건반이 있는 것이 아니다. 이 때 과연 음악적 악보나 음표를 input으로 보낼 수 없는 경우에는 Max를 어떻게 사용해야 할 것일까? ctlin은 MIDI 컨트롤러나 Max UI MIDI 컨트롤러에서 나오는 정보들을 모아 특정한 결과값을 내보낼 수 있게끔 한다.
ctlin object은 컨트롤러의 모든 정보들을 가질 수 있는 아주 유용한 object으로써 다음과 같은 값들을 output으로 내보낼 수 있다. 이때 나오는 결과값들은 모두 숫자이다.
- Controller Value: Slider이나 Dial의 포지션을 내보낸다.
- Controller Number: 유저가 변화를 가하고 있는 특정 dial들을 의미한다.
- MIDI Channel: 16개의 channel중 하나를 골라 특정한 MIDI 컨트롤러로써 작동할 수 있게끔 함.
이때 만약 유저가 ctlin에 Controller Value 결과값을 고정으로 설정하고 나머지들만 output으로 나오게끔 만들고 싶을 때 다음과 같이 특정 Controller Value값을 argument로 설정한 다음 해당되는 Controller Value에만 다음과 같은 Controller Number과 MIDI Channel을 가지게끔 만들어 줄 수 있다.

Sliders
Max에서 제공하는 Slider와 Dial 같은 User Interface (UI) object들은 유저들에게 별도의 MIDI 컨트롤러가 아닌 컴퓨터로써 유저들이 직접 patcher안에 있는 object들을 클릭하여 작동할 수 있게끔 한다. UI는 button, toggles, sliders 그리고 dial과 같은 많은 형태로 있으며 이는 다음과 같은 역할을 한다. 이 때 종류는 다르지만 기본적으로 작동되는 원리는 비슷하여 0에서 127사이의 값들을 도출하는 것을 기반으로 한다. 이 때 어떠한 slider들은 0-127이 아닌 다른 숫자 range들로써 작동되게끔 설정할 수 있거나 소숫점을 집어넣게 할 수 있다.
slider

dial

number box

kslider

rslider

nslider

pictslider

Controller Fun
아마 이쯤되면 MIDI 컨트롤러에 대해 많이 햇갈릴 것이다. 이때 과연 MIDI 컨트롤러와 같은 것이 미디어를 리얼타임으로 인터렉트하는지에 대해 궁금할 수 도 있다. 이것들은 나중에 시각적인 결과 안에서의 물리적 제스처가 어떠하여 결과를 내는지에 대해 그려보는 것이 아주 중요하다. MIDI Devices들은 우리들에게 있어 많은 파라미터들을 한번에 바꾸게 만들어 줄 수 있는 간편한 input 컨트롤러로써 Max에서 임의로 어떠한 미디어 정보들을 특정 결과로 나가게 하는 방식을 이해하는데 아주 중요한 역할을 하게 된다.

Sequencing
UI Object들은 유저들에게 직관적으로 무엇을 입력해야 하는지에 대해 시각적 정보와 함께 알려주어 더욱 편안하게 작업을 할 수 있게끔 해준다. 이때 Ableton Live와 같은 DAW 프로그램과 같은 소프트웨어 기능들을 Max상에서도 제공해주는데 live.step 과같은 object들은 어마어마한 기능들을 제공해준다. 깊게 들어가지 않을것이지만 나중에 다시 한 번 살펴보는 것도 나쁘지는 않을 것 같다.

Miraweb
Cycling 74에서는 Miraweb이라는 패키지를 만들어 유저들에게 웹브라우저와 함께 있는 어느 디지털 device를 가지고 Max를 연결할 수 있게끔 하였다. Miraweb을 사용하기 위해서는 File 메뉴에서 Show Package Manager를 클릭한다음 Miraweb을 검색하여 다운받아야 한다.

Miraweb을 다운받고 나면 mira.frame 이라는 object을 생성하여 Max상에서 인터넷 브라우저와 연결할 수 있다는 것을 알게끔 해야 한다. 이때 websocket이라는 connection을 콘솔창에서 자동으로 생성하게 되는데 이는 웹브라우저가 Max와 인터렉트할 수 있다는 것을 알려준다. 그때 생성되는 웹 주소를 브라우저에 입력하여 들어간다음 이때 Max상의 UI Object을 mira.frame안에 적용하면 브라우저 상에 똑같이 따라져서 만들어지는 것을 알 수 있다. 만약 브라우저 상에서 object들의 값을 바꾸게 되면 Max또한 바뀌게 된 값들을 output으로써 내놓게 될 것이다. 또한 마찬가지로 p connect-a-slider 와 같은 object에 UI Object을 연결하게 되면 Max에서도 또한 값을 제어가능케 할 수 있다.
이번 단원은 조금 많이 어렵고 기본적인 것들이 많아 배워야 할 점들이 많았던 것 같다. 아마 다음 부턴 본격적으로 각기 사운드와 시각적 material들을 다룰 수 있는 기회를 제공하는 MSP와 Jitter에 대해 배우게 되어 기대가 된다.
'Interactive Art > Max_Interactive and Digital Arts' 카테고리의 다른 글
| Module 5 - Working with Audio in Max (0) | 2022.10.31 |
|---|---|
| Module 4 - Working with Video in Max (0) | 2022.10.20 |
| Module 2 - Introduction to Max (0) | 2022.09.14 |
| Module 1 - Overview of Interactive and Digital Media (0) | 2022.09.14 |