ListPatterns
ListPattern은 여러 방법으로 오브젝트의 array를 반복해서 실행하는 방법이다. 모든 ListPatterns은 공통적으로 instance variables list and repeats를 가진다. List variable 은 array로 구성되어 반복적으로 실행되어질 값들이며, repeats variable은 얼마만큼 실행할것인지를 지정해준다. default repetition은 1이다.
대표적인 예로 Pseq가 있다.
(
var a, b;
a = Pseq.new(#[1, 2, 3], 2); // 1, 2, 3을 2번 반복.
b = a.asStream;//stream으로 만들어 줍니다.
7.do({ b.next.postln; });
)
위를 실행해보면, 총 7번 실행해야 하는데 stream은 6개의 값(1,2,3,1,2,3)만 가지고 있어서 마지막 값은 nil이 나오고 7을 출력해주는데, 그 7은 stream에 있는 수가 아닌 do의 실행횟수를 의미합니다.
(
var a, b;
a = Pseq.new(#[1, 2, 3, 4], 3, 2); // repeat 3, offset 2, 실행시켜보면 3부터 읽기 시작합니다.
b = a.asStream;
13.do({ b.next.postln; });
)
Pseq을 pitch 값으로 사용해 봅니다.
(
s = Server.internal;
SynthDef( “Help-SPE3-SimpleSine”, {
arg freq, sustain=1.0;
var osc;
osc = SinOsc.ar( [freq,freq+0.05.rand] ) * EnvGen.ar(
Env.perc, doneAction: 2, levelScale: 0.3, timeScale: sustain
);
Out.ar(0,osc);
}).send(s);
)
(
var a, d;
a = Pseq(#[60, 61, 63, 65, 67, 63], inf ).asStream.midicps;//숫자들을 midi값으로 지정해주고
d = 0.3;
Task({
12.do({
Synth(“Help-SPE3-SimpleSine”, [ freq, a.next, sustain, d ]);
d.wait;
});
}).play
)
Pser는 list의 수를 순서대로 주어진 수 만큼 출력한다.
(
var a, b;
a = Pser.new(#[1, 2, 3], 5); // return 5 items
b = a.asStream;
6.do({ b.next.postln; });
)
Prand는 주어진 수를 random으로 추출하여 두번째 argument에 주어진 수 만큼 출력한다.
(
var a, b;
a = Prand.new(#[1, 2, 3, 4, 5], 6); // return 6 items
b = a.asStream;
7.do({ b.next.postln; });
)
(
var a, d;
a = Prand(#[60, 61, 63, 65], inf).midicps.asStream;//inf라고 되어있는것은 무한대로 추출한다는 뜻. 값의 중복도 일어남.
d = 0.3;
Task({
12.do({
Synth(“Help-SPE3-SimpleSine”,[freq, a.next]);
d.wait;
});
}).play;
)
Pxrand 는 Prand와 비슷하지만, Prand 에서 처럼 이웃하는 값이 중복값으로 주어지지 않는다.
(
var a, b;
a = Pxrand.new(#[1, 2, 3], 10); // return 10 items
b = a.asStream;
11.do({ b.next.postln; });
)
Psuf는 Pser와 값으나 그 값이 scramble 된다. 그러나 이와 Pxrand 와 다른점은 list가 단 한번 scramble된 후, 그것을 반복한다.
(
var a, b;
a = Pshuf.new(#[1, 2, 3, 4], 3);
b = a.asStream;
13.do({ b.next.postln; });
)
(
var a, b;
a = Pshuf(#[60, 61, 65, 67], inf).midicps.asStream;
Task({
12.do({
Synth(“Help-SPE3-SimpleSine”,[freq, a.next]);
0.5.wait;
});
}).play;
)
Nesting Patterns
Pattern을 Pattern내부에 사용하여 Stream을 만들수 있다.
(
var a, b;
a = Pseq.new([1, Pseq.new([100,200], 2), 3], 3);
b = a.asStream;
19.do({ b.next.postln; });
)
(
var a, b;
a = Prand.new([
Pseq.new([1, 2], 2),
Pseq.new([3, 4], 2),
Pseq.new([5, 6], 2)
], 3);
b = a.asStream;
13.do({ b.next.postln; });
)
//Pitch변화를 위한 Sequence.
(
var a;
a = Prand([
Pseq(#[60, 61, 63, 65, 67, 63]),
Prand(#[72, 73, 75, 77, 79], 6),
Pshuf(#[48, 53, 55, 58], 2)
], inf
).midicps.asStream;
Task({
loop({
Synth( “Help-SPE3-SimpleSine”, [freq, a.next.postln] );
0.3.wait;
});
}).play;
)
(
var a;
a = Pseq(#[60, 62, 63, 65, 67, 63], inf) + Pseq(#[0, 0, 0, 0, -12], inf);
a = a.asStream.midicps;
Task({
25.do({
Synth(“Help-SPE3-SimpleSine”,[freq, a.next]);
0.3.wait;
});
}).play;
)