SC에는  (소괄호) {중괄호} [대괄호] 및 따옴표 ("Text") 와 같은 인클로저 유형이 있다

괄호를 더블클릭하여 괄호 안의 영역을 선택할 수 있는데 
특정 영역을 복사하거나 삭제할 때 편리하게 사용할 수 있다


따옴표(" ")는 공백을 포함한 문자열을 단일 단위로 묶는데 사용며 이를 String이라고 부른다. 

"String"

한 쌍의 작은 따옴표(' ')는 보통 파라메터의 이름을 붙힐 때 사용되는 Symbol을 만드는데
아래와 같이 적을 수 있다 (\를 이용해도 된다)

'symbol' 혹은 \symbol



이번에는 SC로 간단한 사칙연산을 해보자


2+2*2는?


SC는 8이라고 답한다


일반적인 사칙연산으로는 당연히 6이지만 SC는 8이라고 답한다
연산자 중요도와 관계 없이 무조건 왼쪽에서 오른쪽으로 계산을 하기 때문인데
원하는 답을 얻으려면 ()로 우선순위를 정해주어야 한다

2+(2*2)

소괄호는 양자연산자(binary operator)와 메시지를 결합할 수도 있다
이 경우 메시지가 먼저 계산된다

예를들어 2+2.squares의 결과는 6 이고 (2제곱+2) 
(2+2).squares의 결과는 16 이
다 (2+2의 제곱)

[ ]는 array(배열)로 item의 콜렉션을 정의한다

array는 숫자 뿐 아니라 텍스트, 함수, 또는 전체 패치를 포함할 수도 있다 
콜렉션 유형중 하나인 Array는
reverse, scramble, mirror, rotate, midicos, choose, permute와 같은 메시지를 받을 수 있으며 
배열에 대한 수학 연산도 가능하다


[0,1,2,3,4,5,6,7,8,9,10,11].reverse          // 12음렬의 역행
11-[0,1,2,3,4,5,6,7,8,9,10,11].reverse     // 역행의 반전
[1,2,3,4,5].scramble                               // diatonic scale
[1,2,3,4,5].mirror                                    // pentatonic
[1,2,3,4,5].rotate
[1,2,3,4,5]*40.midicps.round(0.1)          // midi번호를 Hz로 변환
[1,2,4,8].reciprocal.choose
8.reciprocal*[1,2,3,4,5,6,7,8].choose    // 퀀타이즈 값의 배수
[1,2,3,4,5,6,7,8,9,10,11].permute(5)


{ }는 함수(function)를 정의한다. 


exprand(1, 1000);
{exprand(1, 1000)};

첫번째 라인은 무작위로 숫자를 뽑아 해당 수를 포스트 창에 띄워주는데 
두번째 라인은 포스트 창에 a function 이 찍힌다

이게 무엇을 의미하는지 아래 코드를 실행해보자

rand(1000.0)!5 //숫자를 뽑고, 그것을 복제
{rand(1000.0)}!5 //숫자를 뽑는 함수자체를 복제

첫번째는 임의의 숫자를 하나 뽑고 그것을 복제하는 반면
두번째는 난수 선택 함수를 5번 실행하고 그 결과를 array로 반환한다

함수는 plot, play, scope, dup 등 몇가지 메시지를 받을 수 있다

{LFNoise0.ar}.play // 렌덤숫자 재생
{LFNoise0.ar(1000)}.plot // 렌덤숫자 그래프
{LFNoise0.ar(1000)}.scope // 재생하고 scope 보여줌
{100.rand}.dup(10) // 렌덤숫자 10개
{100.rand}!10 // 위와 동일


array가 UGen의 아규멘트로 사용되면
내부적으로 코드가 복제된다

즉 아래 코드를 실행하면 

{SinOsc.ar([200, 300, 400], 0, [0.3, 0.2, 0.1])}.play

내부적으로 아래와 같이 실행된다

체널 1: {SinOsc.ar(200, 0, 0.3)}.play
체널 2: {SinOsc.ar(300, 0, 0.2)}.play
체널 3: {SinOsc.ar(400, 0, 0.1)}.play


{ [SinOsc.ar(1000, mul: 0.3) ! 2] }.play; //아래와 같은 결과
{ [SinOsc.ar(1000, mul: 0.3), SinOsc.ar(1000, mul: 0.3)] }.play;


이러한 다중 채널 확장 (Multichannel expansion)은
SC의 간편하면서도 강력한 측면을 단적으로 보여주는 예다

여러 체널을 추가하는데 있어서
Max나 PD같은 패치기반 언어에서는 모든 오브젝트와 패치코드를 손으로 일일히 복제해야 하나
SC에서는 단지 몇줄의 코드면 된다

SC를 최대한 활용하려면 어떤 오브젝트를 사용할 수 있는지 
어떤 종류의 출력물이 생성 되는지를 알아야 할 것이다

이에 대한 설명은 Help를 참조하면 된다

SC에서 사용하는 메시지나 UGen들은 대부분 Help파일을 가지고 있으니
도움말이 필요한 해당 UGen이나 메시지에 커서를 놓고 [cmd+d]를 누르면 
간단한 설명과 아규멘트 리스트 및 예제가 들어있는 도움말이 나타난다






Posted by Elec-Kiwi
,