MSP Tut.21 MIDI control: Using the poly~ object

Tutorial 21 MIDI control: Using the poly~ object

A different approach to polyphony
지난시간데 어떻게 poly를 시용하여 다성음을 만드는지 보았지요. 이번에는 더 효과적인 방법을 사용하여 같은 것을 해볼것입니다. 그리고 우리가 사용할 오브젝트는 poly~ object.입니다.
이전 챕터에서 보여준 예에서 우리는 subpatch를 여러 번 복사하여 poly object’s voice numbering을 서브패치의 각각 다른 복사본에 전송시켰었지요. 단순하게 어떻게 subpatch를 이용하여 소리를 제작하는지에 대한 쉬운 예가 되었었습니다. 이번 subpatch인 littlesynth~ 를 이용하여 단순한 4개의 다성 synthesizer를 보여줄 것입니다. :

이 패치의 사용에는 2가지 단점이 따릅니다. 첫째로는 너무 많은 ‘복제’가 필요하며, 그것이 littlesynth~ 를 복사한것들과 함께 patch된다는것입니다. 그리고 또 CPU사용에 문제가 생집니다. littlesynth~ 의 4개의 카피가 언제나 작동되고있고, 사운드를 만들어내지 않는 때 조차도 작동하고있지요. MSP 2.0에서는 이 문제를 해결하기 위한 다른 방법을 소개합니다. poly~ object 는 여러분이 같은 MSP subpatch를 하나의 오브젝트 안에서 여러 번 복제하여 사용하는 것을 가능하게 해 줍니다. 여러분은 또한 각각의 subpatch안에서 CPU를 절약해 가면서 signal processing 을 할 수 있습니다.

The poly~ object

poly~ object의 argument에는 만들어질 패치의 이름과 copy들의 수를 적어줍니다. 그 숫자는 다성음을 만들 때 얼마나 많은 copy를 사용할지를 결정해 주겠지요.

poly~ object 를 더블클릭하여 littlebeep~를 봅니다. :

in, out~, thispoly~를 전에 본적이 없다면 남은 패쳐는 아주 간단해집니다. 들어오는 MIDI노트의 수를 받아서 그것을 mtof를 이용하여 frequency 값으로 바꾸어주며, 그 frequency에서 140ms의 duration을 가진, 그리고 line~에서 들어오는 envelope을 가진의 sine wave를 출력해줍니다. 그럼 in and out~ objects는 무엇일까요? Poly~에 사용된 Subpatch들은 inlet과 outlet에 특별한 오브젝트들을 사용합니다. 그것이 in과 out인데, 이것들은 inlet과 outlet을 제어하는데 사용됩니다. 그리고 in~과 out~ objects는 signal inlets 과outlets을 제어하는것이구요. 그 오브젝트에 써주는 숫자로 어떤 오브젝트에 어떤 inlet을 할당할지를 결정합니다. 예를들어 In 1는 가장 왼쪽 inlet의 poly~과 부합합니다.  poly~ object는 계속해서 inlet과 outlet들의 숫자를 감지합니다. 어떤 subpatch를 불러들일지 여러분이 argument를 통해서 결정해 주어야 합니다.
poly~로 보내진 메시지는 note, midinote, target 메시지를 다이나믹하게 사용한 다른 subpatch의 예를 볼수 있습니다. poly~ 에서 하나의 note메시지를 왼쪽 인렛으로 받으면 그것은 메모리에 가진 subpatch의 copy들을 통해서 스캔하고 현재 ‘not busy’인 것을 발견합니다. 그리고 그 메시지를 통과시킵니다. subpatch는 poly~ object에게 thispoly~ 를 사용하여 지금 ‘busy’상태라는 것을 알려줍니다. thispoly~object는 시그널, 숫자 아무거나 받을수 있으며 그것의 ‘busy’상태를 설정합니다. zero signal이나 0의 숫자가 들어오면 poly~에게 그것이 note 또는 midinote message에 사용 가능하다는 것을 알려줍니다. non-zero signal 이나 다른 값이 들어오면 ‘busy’라는 것을 알려주게 되겠지요. 따라서 note 또는 midinote 가 busy상태가 끝나기 이전까지는 오브젝트로 들어가지 못하게 합니다. busy state는 subpatcher에서 play되는 음의 duration에 부합하게 됩니다. 하지만 다른것에 부합될수도 있습니다. 위의 예제에서는 *~의 audio level가 nonzero일 경우에 부합하겠지요. line~의 amplitude envelope 가 0에 다다르면 소리는 멈추게 됩니다. 그리고 thispoly~의 subpatch의 copy 가 poly~ 에게 더 많은 input을 받을 준비가 되었다는 것을 알려줍니다.
thispoly~ 는 또란 각 subpatch의 복제내에서 signal processing 의 실행을 제어할 수 있습니다. mute message 1 이 thispoly~ 고 보내지면, subpatch 내의 모든 signal processing 이 멈춥니다.
stops. mute 0 message 를 받으면 signal processing 은 다시 시작합니다.
우리는 littlebeep~ subpatcher를 다시 써서 signal processing를 끌 때에 이득을 취할 수 있습니다. 하나의 노트가 끝나고 그것을 다시 킬 때, 새로운 이벤트가 받아질때에.

이것이 패치의 function을 바꾸지는 않지만 CPU할당량이 언제나 현재 소리나는 음의 수에 의존되기 때문에 또다른 효과를 보게 됩니다.

poly~를 사용하여 이벤트를 할당하는 또 다른 target message를 사용하는 것입니다. Poly~의 왼쪽 인렛에 정수를 들어오게 하여 모든 수반하는 메시지들을 subpatch로 들어가게 합니다. 그때 poly~와 결합된 poly object 는 (지난챕터에서 본) MIDI synthesizer를 만들어 냅니다.
poly~ subpatch 가 target message와 사용되면 다음과 같이 됩니다.:

이 예제에서, 들어오는 MIDI pitches와 velocities는 sine tone을 synthesize합니다. List가 받아지면 subpatcher 는 bang 을 thispoly~로 보내어 그 patcher를 출력하거나 voice number를 출력하게 합니다. 아래의 예제는 voice number 가 보내지는것입니다. 따라서 여러분이 그것을 parent patch로부터 볼수 있습니다.

parent patch에서 poly object는 voice numbers를 makenote에서 나온 MIDI pitch와velocity pair로 보냅니다. 그 voice number 는 target message 와 함께 poly~로 보내집니다. 그리고 poly~에게 to send 수반하는 data를 poly~의 targetbeep~ subpatcher로 보낼것을 말해줍니다. poly 가 note-offs를 계속 감지하기 때문에 이것은 적절하게 voices 을 재생합니다. poly~ 의 두번째 outlet은 지속하는 voice가 메시지를 받았음을 기록합니다. 이것은 아마poly에서 나오는 voice number와 같아야 합니다. 왜냐하면 우리가 사용하는 poly가 특정 target을 지정해 주기 때문입니다.

thispoly~ object 는 parameters를 특정한 poly~ subpatcher로 할당해주는데 사용됩니다.
loadbang object와 thispoly~가 연결됨으로서 우리는 voice number로 필터의 center frequency를 제어합니다. :

littlefilter~ subpatcher는 여기에서thispoly~에서 받은 voice number를 사용하고, 두번째 inlet에서 받은 base frequency에 의해 곱해집니다. 입력되는 signal은 모든 16개의 patcher들에 의해, 첫번째 inlet에서 들어오는 정수로 제어되는 각 patcher의 출력 amplitude와 함께 동시에 필터됩니다.

littlefilter~를 이용한 예입니다.


metro object는 counter 와 a random로 걸립니다. Counter는 target message의 소스가 되며 poly~ object 로 들어오는 littlefilter~ 의 를 통해 순회합니다.  random number는 amplitude를 제어합니다.
poly~ 의 인렛은 모든 subpatcher의 in~에 대응합니다. 그리고noise~ object는 poly~내에 있는 subpatcher들에 noise를 줍니다. 두번째 inlet은(in2) 필터의 base frequency를 제어합니다. Frequency가 poly~오 보내지기 위하서 target0이 지정됩니다. 여러분은 또한 특정한 poly~ subparch를 open
message를 통해서 열어 볼수 있습니다. Voice number 15가 할당된 subpatch는 다음과 같습니다.


보다시피 base frequency 는1500. Hz이며 이것은 voice number 15와 가장 최근에 두번째 inlet에 들어온 frequency(100)와의 곱으로 이루어집니다.

Leave a Comment.

This site uses Akismet to reduce spam. Learn how your comment data is processed.