26. Patterns

Patterns이란 여러개의 stream들을 하나로 묶어주어 출력하고 콘트롤 하게 해주는 방법이다.
따라서 stream에서 쓰이는 방법들과 많이 일치한다. 

앞에 Stream에서 사용됬던 FuncStream처럼 쓰이는것이 Pfunc으로 거의 같은 역할을 한다. 앞에 FuncStream에서는 stream자체가 정의되고 next라는 메세지를 통해서 값을 출력해주었지만 pattern에서는 Pfunc이 값을 만들고, 그것을 Stream으로 만들어 주는 asStream이라는 메세지가 필요하다. 

(
var a, b;
a = Pfunc.new({ #[1, 2, 3, 4].choose });
b = a.asStream; // make a stream from the pattern
5.do({ b.next.postln; }); // print 5 values from the stream

)


또한 앞에서 Routine이 Stream을 만드는데 쓰였지만, 여기서는 Prout가 사용되어 이것이 Routine 을 보낸다.
(
var a, b, c;
a = Prout.new({ 
  3.do({ arg i; 3.rand.yield; }) 
 });
// make two streams from the pattern
b = a.asStream;
c = a.asStream;
4.do({ b.next.postln; }); // print 4 values from first stream
4.do({ c.next.postln; }); // print 4 values from second stream
)
물론 위의 예제만 보면 더욱 복잡해 보인다. 그러나 일정한 값을 지정해준 후, 그것으로 여러개의 다른 stream을 만들어 낼 수 있다는 점을 상기하면 pattern을 복잡한 data를 생성하고, 여러개의 parameter를 동시에 control할 수 있는 방법 중 하나가 된다.


Math on Patterns
Stream의 경우와 거의 비슷하다. Pattern Object가 Stream(Routine이 했던 일)의 자리를 대신한다는 것만 제외하고..
(
var a, b, c;
// a is a pattern whose stream counts from 0 to 9
a = Pseries.new(0,1,10);
b = a.squared; // pattern b is a square of the pattern a
c = b.asStream;
12.do({ c.next.postln; });
)
//Stream에선 아래와 같았다. 
(
var a, b;
// a is a stream that counts from 0 to 9
a = Routine.new({ 
  10.do({ arg i; i.yield; }) 
 });
b = a.squared; // stream b is a square of the stream a
12.do({ b.next.postln; });
)
비교해보면, variables는 3개가 들어가지만, Pattern의 경우 그 구조가 훨신 간단하다.


Filtering on Patterns
Stream과 같이 .collect, .select, .reject의 메세지를 사용하여 값을 추출해낼 수 있다. 
(
var a, b, c;
// a is a pattern whose stream counts from 0 to 9
a = Pseries.new(0,1,10);
// b is a pattern whose stream adds 100 to even values
b = a.collect({ arg item; if (item.even, { item + 100 },{ item }); });
c = b.asStream;
6.do({ c.next.postln; });
)
(
var a, b, c;
// a is a pattern whose stream counts from 0 to 9
a = Pseries.new(0,1,10);
// b is a pattern whose stream only returns the odd values
b = a.select({ arg item; item.odd; });
c = b.asStream;
6.do({ c.next.postln; });
)
(
var a, b, c;
// a is a pattern whose stream counts from 0 to 9
a = Pseries.new(0,1,10);
// b is a pattern whose stream that only returns the non-odd values
b = a.reject({ arg item; item.odd; });
c = b.asStream;
6.do({ c.next.postln; });
)

Reference : SC3 메뉴얼


Leave a Comment.

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