6. CombiningCH/multi-CH/MouseXY/XLine/Line

1. Combining signals.

-UGen의 argument를 다른 UGen으로 변경하여 가능성을 확장시킬 수 있다.

{SinOsc.ar(SinOsc.kr(1, mul:50, add:400),mul:0.3)}.scope

frequency를 SinOsc로 하여 sine wave로 변경.
mul을 다른 범위로 주어
예를들어 -1~1에서 mul = 4 로 해주면 `-4~4의 범위의 값을 얻는다.
add또한 원래의 값 -1, 1에 add = 2 를 해주면 1~3의 범위를 얻는다.
즉 위의 구문에서는 400-50hz에서 400+50hz를 움직이는 frequency를 생성한다.

-LFNoise0은 낮은 frequency의 noise를 생성한다.

LFNoise0(freq,mul,add)   // freq is the rate to generate values

{LFNoise0.ar(10)}.scope

{SinOsc.ar(LFNoise0.ar(10,100,400))}.scope //mul:range, add:center value, frequency:400~600hz

-()를 사용하여 2개의 signal을 더할수 있다. 실행시에는 ()안을 모두 선택한후 ENTER.
add 2 signals:
(
{SinOsc.ar(400,0,0.3)        
        +
SinOsc.ar(123,0,0.3)
}.scope
)

multiply two signals:
(
{SinOsc.ar(400,0,0.3)
*
SinOsc.ar(100,0,0.3)
}.scope
)

-Parameter의 이름들은 다음과 같은 방법으로 표현될 수 있다. 복잡한 구문에서는 다음과 같은 방법이 도움이 된다.
(
{SinOsc.ar(freq: LFNoise0.ar( freq: 10,
                                                        mul: 100,
                                                        add: 500),
                mul: 0.3
                )
}.scope
)
//——————————————
2. Multi-channel expansion(and contraction)
UGen내의 parameter에 주어진 (array)와 같은 collection은 multi-channel output을 만든다.:
{SinOsc.ar([220,350])}.scope

Mix는 multi-channel output을 mix시켜준다.:
{Mix.ar(SinOsc.ar([220,365],0,0.3))}.scope

다음의 결과와 비슷하다. :
{SinOsc.ar(220,mul: 0.3) + SinOsc.ar(365,mul: 0.3)}.scope

//——————————————
3. MouseX,MouseY
마우스를 모니터의 X,Y축으로 사용한 컨트롤방법에 사용되는 오브젝트.

MouseX.kr(minval, maxval, warp, lag)
warp : 0= linear, 1=exponential 또는 직접 ‘linear’, ‘exponential’이라고 써준다.

{SinOsc.ar(MouseX.kr(100,2000),0,0.1)}.scope
{SinOsc.ar(MouseX.kr(100,2000,’exponential’),0,0.1)}.scope
{SinOsc.ar(MouseX.kr(100,2000,’linear’,5),0,0.1)}.scope

(
{SinOsc.ar(freq: MouseX.kr(100,2000,’exponential’),
                        mul: MouseY.kr(0.1, 0.01))// top of screen has larger amp.
}.scope
)

//——————————————
4. XLine, Line
-Controlling values with XLine:
        XLine (start, end, dur, mul, add, doneAction)  ar or kr
        exponential curve를 생성한다.
        start 와 end 가 0이 아닌수여야 한다.(Csound와 비슷)
주의: 마지막 값은 라인이 끝날때 수행되기위한 엑션이 아닌이상 지속되어야 한다.

옵션들은 EnvGen헬프를 참고
doneAction: 2 는 엑션이 끝나면 종결한다.(CMD+.를 할 필요가 없게 된다)

{SinOsc.ar(XLine.kr(100,2000,10),0,0.3)}.scope
{SinOsc.ar(XLine.kr(100,2000,10,doneAction:2),0,0.1)}.scope

-Line은 linear change를 형성.:
        Line (start, end, dur, mul, add, doneAction)  .ar or .kr
{SinOsc.ar(Line.kr(100,2000,10, doneAction: 2),0,0.1)}.scope

//——————————————
http://csound.x-y.net
Ji Youn Kang,
Csound Max Community

5. BootServer/SinOsc/Defaults

1. Boot server

UGen을 실행하려면 : boot button을 이용하여 서버를 시동시키거나,
다음의 코드를 이용하여 부팅한다.

Server.default = Server.internal.boot;

play는 localhost와 작동되며, scope는 internal server와 작동된다. (play와 scope는 message code)
지금은 internal server를 default로 사용할것이다.

//—————————————————–
2. SinOsc
;Sinewave generator.

{SinOsc.ar}.play//실행위해 enter, 중지위해 CMD+.
{SinOsc.ar}.scope//scope로도 보여줌.

UGen은 이전에 설명했듯이 .ar, .kr와 같은 message를 사용하여 play한다.

SinOsc에 대한 정보를 보려면, SinOsc를 마우스로 활성화 시킨후 CMD+?를 누른다.
그러면 다음과 같은 help파일을 볼 수 있다. (예제는 생략)
//;;;;;
SinOsc                        interpolating sine wavetable oscillator

SinOsc.ar(freq, phase, mul, add)

This is the same as Osc except that the table is a sine table of 8192 entries.
freq – frequency in Hertz
phase – phase offset or modulator in radians
//;;;;;

-argument lists (10,2,3)은 comma에 의해 분리시킨다.

{SinOsc.ar(220)}.scope//220Hz의 Sine wave
{SinOsc.ar(220,0,0.3)}.scope//look at the amplitude

-amplitude를 변경하되 phase값을 변경하고 싶지는 않다면 :
mul:을 사용한다.

{SinOsc.ar(220, mul:0.3)}.scope
{SinOsc.ar(mul:0.3)}.scope

//—————————————————–
3. Defaults
UGen은 Argument에 default 값을 가진다. 이것을 알고싶으면 UGen을 선택하고 menu 에서
Lang>Open Class Def.을 선택한다.

예를들어 SinOsc에서 default frequency는 440.0이다.:

SinOsc : UGen {        
        *ar {
                arg freq=440.0, phase=0.0, mul=1.0, add=0.0;
                ^this.multiNew(‘audio’, freq, phase).madd(mul, add)
        }
        *kr {
                arg freq=440.0, phase=0.0, mul=1.0, add=0.0;
                ^this.multiNew(‘control’, freq, phase).madd(mul, add)
        }
}

//——————————————

http://csound.x-y.net

Ji Youn Kang,

Csound Max Community

4. Functions/Collections/UGens as object

1. Functions as objects  

-괄호안에 code는 function이 된다.: {code}

{1+2}//enter로 실행후 post window확인
{1+2}.value//값을 보기
{1+2*3}.value

-Funcation은 또한 arguments를 가질수 있고 다음 두가지 방법으로 가능하다.
f = {arg a,b; a*b}//실행
g = {|a,b| a*b}//실행
f.value(10,2)//위의 코드를 실행해 주지 않으면 값을 얻을수 없다.
g.value(10,2)

-a~z까지의 심볼들은 global variables로 정의되고 특정한 선언없이 사용될 수 있다.

//——————————————–
2. Collections as objects
-item의 list
[100,200]
[1,2,3,4,5,6].choose//random choice
[1,2,3,4,5,6].scramble//different arrays
[1,2,3,4,5,6].rotate//rotation
[1,2,3,4,5,6]+10//each number is added by 10

-Collection은 또한 shortcut으로 표기 가능
(1..5)

f=(10..20)
f[1]

(10,12..20)//even number from 10 to 20
(1,3..8) + (1,4..8)

Array.series (10,1,100) //number, start, distance
Array.fill(10,{rrand(400,800)})//number, something to fiill it with such as a function
Array.fill(10, rrand(400,800))//Array가 function{}으로 채워지지 않을경우 같은 값만 출력한다.

//——————————————–
3. UGens(unit generators) as objects
-UGen들을 보려면 다음을 실행
UGen.dumpClassSubtree
또는 click on underline:
          [Tour_of_UGens]
          
-UGens을 audio rate으로 사용할때에는 .ar을 사용한다. 이때에 .ar을 message라 한다.;
SinOsc.ar
control rate: .kr
MouseX.kr

-Function내에서 사용될때에 UGens은 audio/control signals을 produce한다.

——————————————
http://csound.x-y.net
Ji Youn Kang,
Csound Max Community