Max/MSP/Jitter Workshops at CNMAT this summer

There are still a few spaces left in our upcoming workshops. If you  
are interested in attending send an e-mail to richard@cnmat.berkeley.edu

2005 Max/MSP/Jitter Workshops at CNMAT

Max/MSP Day School (for beginners to intermediate users), July 11-15,  
11 AM -4 PM
Max/MSP Night School (for intermediate to advanced users), July  
11-15, 7-10 PM
Jitter Night School, July 16-18, 7-10 PM
http://www.cnmat.berkeley.edu/Max_MSP2005.html

|| michael f. zbyszynski, ph.d.  —  music composition research
|| mzed@cnmat.berkeley.edu — +1.510.643.9990×314
|| http://homepage.mac.com/mikezed/

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)와의 곱으로 이루어집니다.

MSP Tut.20 MIDI control: Sampler

Tutorial 20 MIDI control: Sampler.

Basic sampler features
이번 챕터에서는 MIDI keyboard 에서부터 미리 녹음된 소리를 재생하는 것을 해 볼 것 입니다. 여기에 있는 디자인은 기본적인 샘플러 키보드의 주요 특징을 대체해 줍니다. : 키보드의 영역에 샘플을 할당하고
각 샘플에 키 로케이션을 지정해주고
키가 연주되는 곳에 따라 다른 적당한 변화들과 함께 샘플을 플레이하고.
다성음 만들기 입니다.

이 패치는 단순화를 위하여서 pitchbend wheel 과 mod wheel로부터의 control은 배제해 둘 것입니다. 그 사용법은 이전 두 챕터에서 보여진 것과 많이 다를 것입니다.
이 패치에서 우리는 groove~ 를 사용하여 반복되는 샘플을 사용함으로서 다양한 스피드로 샘플을 재생할 것입니다. Tutorial 19에 명시했듯이 ,만약 우리가 다성적인 악기를 원한다면 우리가 동시에 분리된 많은 음표들을 원하는 것만큼이나 많은 sound-generating objects가 요구되어집니다. 이 투토리얼 패치에서 우리는 4개의 subpatch samplervoice~ 의 반복적인 사용으로 4개의 voice polyphony을 만들 것입니다. Tutorial 19에서와 같이 우리는 poly를 사용하여 voice number를 각각의 MIDI note로 보내고, route를 사용하여 note information를 적절한 samplervoice~ subpatch로 보낼 것입니다.

samplervoice~를 실험해 보기 이전에 어떤information이 샘플을 정확하게 재생하는데 필요한지 보겠습니다.
1. 그 sound samples 은 memory로 읽혀져야 합니다.( buffer~ 에서),그리고 그 메모리 할당의 list(buffer~ 이름들) 가 남아있어야 합니다.
2. 각각의sample은 키보드 영역에 할당되어야 하며 키 할당의 list도 남아있어야 합니다,
3. 각 영역의 기본 키들의 list도 (샘플이 재생될, 이조되지 않은 키) 남아있어야 합니다.
4. 각 샘플의 loop point의 list (그리고 looping 이 켜질지 말지)에 대한 부분도
5. 어떤 MIDI note message 가 받아질 때에, 그리고 samplervoice~ 에 할당될 때에, 그 서브패치에 있는 groove~ object는 우선적으로 어떤 buffer~ 에서 (키의 영역에 따라) 읽혀질지 결정해야 하며, 얼마나 빠르게 연주할지(연주될 frequency와 그 영역의 기본key frequency 에 따라), 어떤 loop points가 사용될지, looping 이 켜질지 꺼질지, 어떤 amplitude scaling factor가 velocity로 사용될지 결정해야 합니다.

이 패치에서 samples들은 patch가 열릴 때 메모리로 읽혀질 것입니다. is first loaded.
• p samplebuffers subpatch를 더블클릭하여 그것의Patcher window를 열어봅니다. 그 때 six samples이 buffer~ objects인 sample1, sample2, etc로 읽혀집니다. 만약에 연주상황에서는 RAM에 더 많은 샘플을 할당해야 하는데, 그때 read messages를 사용하여filename 을arguments 로 지정해주고 새로운 samples을 buffer~로 할당합니다.
• subpatch window를 닫고 message box “keyboard sample assignments”를 클릭합니다. funbuff object안에서 숫자로 된 키 영역의 set을 저장합니다. (이 information 은 funbuff 에 patch와 함께 저장되어있는 것을 우리가 message box로 보내는것이기 때문에 그 내용을 볼수 있는것입니다.) MIDI key numbers 0 에서 40가 key region 1이며, 41 에서47키는 key region 2, 등등으로 지정됩니다. a note-on message 가 받아지면 그 key number 는 funbuff로 가서 funbuff 이 key region number를 전달합니다. 그 key region number은 coll에 있는 다른 중요한 정보들을 살펴보는데에 사용됩니다.

coll object를 더블클릭하여 내용을 봅니다.

1, 24 sample1 0 0 0;
2, 33 sample2 0 0 0;
3, 50 sample3 0.136054 373.106537 1;
4, 67 sample4 60.204079 70.476189 1;
5, 84 sample5 0 0 0;
6, 108 sample6 0 0 0;
coll contains sample information for each key region

그 key region number 는 coll안의 정보를 읽는데에 사용됩니다. 예를들어 키 48~52가 눌러질때마다, funbuff 는 숫자 3을 보냅니다. 그리고 키 영역3에 있는 정보가 불려지며 적당한 samplervoice~ 로 보내집니다.
각 키 영역에서의 data는: base key, buffer~ name, loop start time, loop end time, loop on/off flag.입니다.

Poly로 부터의 voice number 는 gate로부터 적절하게 출력되어 coll로부터의 정보가 적절한 서브패치로 가게 합니다.

Playing a sample: the samplervoice~ subpatch
• coll window를 닫고,  samplervoice~ subpatch 의 하나를 더블클릭합니다.

coll로부터의 정보가 subpatch에서 unpack되고 적절한 곳으로 보내져서 groove~가 연주할 준비를 하게끔 해줍니다. 이것은 groove~ 에게 어떤 buffer~가 읽혀질지, 어떤 times이 사용될지, 그리고 looping 이 켜져야 할지에 대해서 말해줍니다. note information이left inlet으로 오게되면 그velocity는 amplitude value로(*~object) 사용되며 note-on key number가 groove~의 playback speed로 사용되어 time0에서부터 playback을 계산하게 해 줍니다. (오른쪽 inlet으로부터 받아진base key number와 함께)

MSP sample rate vs. audio file sample rate
• subpatch window를 닫습니다.
지금 이제 샘플을 제생할 준비가 되었지만 한가지 더 숙지해야 할것이 있는데요, 그것은 저장될 공간을 위해서 samples은mono AIFF files 들이어야 하며sample rate 는22,050 Hz 이어야 합니다. 그것들이 적절하게 연주되는 것을 들으려면 반드시 이렇게 설정해야 합니다.
• dac~ object 를 더블클릭하여 DSP Status window를 열어서 Sampling Rate 를22.050 kHz로 지정해줍니다.
Note: sampling rate를 다시 설정하는 것은 불가능합니다. (hardware에 따라서 다름)
오디오 파일의 sample rate과 MSP에서 사용되는 sample rate의 차이는 샘플 플레이에서는 아주 중요한 문제중 하나입니다. 그 차이점의 해결은 여기에서는 간단하게 해결이 되는데요, 그것은 오디오 ㅏ일이 전부 같은 sample rate을 가지고있기 때문이기도 하며, MSP에서 플레이할 소리가 그 sample들로만 지정되어있기 때문입니다. 그러나 다른 상황에서 다른 sampling rates를 사용하게 될때에 최적의 sampling rate의 조건을 만족시켜주어야 합니다. 그런 상황에서 당신은 오디오와 MSP의 sample rate을 groove~에서의 적절한playback speed를 결정하는데에서 부가적인 요소로 적용시킬수 있습니다. 예를들어서 audio file의 sample rate이 MSP에서 사용되는 sample rate의 절반이라면 그때 groove~ 는 샘플의 절반 빠르기로 연주되어야 합니다. info~ dspstate~ 를 사용하여 sample과 MSP의 sampling rate 를 다음의 예에서 처럼 찾을수 있습니다.

note-on key number 는 연주될 sample의 정보를 불러냅니다. buffer~의 이름이 groove~와 info~로 보내집니다. 그다음 bang 이 dspstate~ 와 info~로 보내집니다. Bang을 받은 dspstate~ 는 MSP의 sampling rate을 기록하며 info~ 는 buffer~에 기록된 AIFF file의 sampling rate을 기록합니다. 왼쪽 아랫부분을 보면 samplingrate information 이 어떻게 groove~의playback speed 로 적절하게 사용되는지를 알 수 있습니다.

Playing samples with MIDI
• audio on을 하여 “Output Level” number box 로 레벨 설정을 합니다. 다른 sample들을 듣기 위해서 미디 키보드의 스케일을 플레이 해봅니다.
전체 키보드에 적절한 하나의 악기소리를 주기 위해서 각각의 키 영역이 샘플 소스로부터 한음표의 한샘플이 포함되어야 합니다ㅣ. 이 경우에서는 그러나 drums, bass, keyboard로 구성된 “band”에 유용하게 만들어지는 방법으로 맞추어 져 있습니다. 오른손, 왼손에 따라 다른 다중적인 음색을 가진 키보드 구성이 사용되게 할 수 있습니다. (미디채널, 시퀀서 사용)
• 다중음색 레이어가 어떻게 시퀀서에 사용되는지 봅니다. “Play Sequence”라고 된 토글을 클릭합니다. Sequence를 중지하려면 다시한번 눌러서 씁니다, audio 를 끄고 p sequence object를 더블클릭합니다.

seq sampleseq.midi object는 이미 저장된MIDI file입니다. midiparse object는 미디 키 넘버와 velocity를 main patch에 있는poly로 보냅니다. 각각 sequence의 시간에 따라 연주는 끝나게 되고 bang 이 seq의 오른쪽 outlet으로 보내집니다.; 그 bang은seq 를 즉시 다시 시작하게 해 줍니다.(계속 loop을 원할경우). 그 sequence 가 사용자에 의해 멈추어지면 bang 이 midiflush로 보내져서 현재 재생되는 어떤 음표든 멈추게 해 줍니다.
• 이 패치를 멈출때에는 DSP에서 Sampling Rate를 원래로 되돌려 놓으세요.