supercollider3 – 기초반 0

예전에 올렸던 실용 Supercollider 튜토리얼입니다. 하루에 한개씩 올릴게요
그전에 보셨던분도 기억을 상기하는 측면에서…

약간 수정해서 하나씩 올리겠습니다. 궁금하신 사항이 있으면 답글 주세요
틀리거나 첨언하시고 싶은 분은 먼저 본문을 수정해주시고 답글 달아주세요.
==================================

 Supercollider (sc)란?
실시간 소리 생성 합성 변조 조작 프로그램 언어
장점 : 뭐든 만들 수 있다.
단점 : 뭐든 만들어야 한다.

기존 시퀀싱 프로그램이나 오디오 에디팅 프로그램에서 쉽게 제공되는 기능을 sc에서는 손수 만들어야한다.
그대신 기존상용프로그램에서 제공하지 못하는 것을 할 수 있다.

()
======================================================

용어풀이
: 아래의 글은 나도 잘 이해하지 못하는 문장입니다만… 일단 처음이라면 심각하게 생각지 마시고 훑고 지나가세요… 좀 지나면 이해갈 겁니다.

Node

노드(Node)는 SC3 synth 엔진에 의해 동작하는 트리 구조 시스템에서 하나의 주소를 가진 꼭지점을 말한다. Synth, Group 두가지 타입의 노드가 있으며, 트리 구조에 의해 모든 Synth는 실행 순서가 정해진다. 노드는 각각 하나의 정수 ID를 가진다.

Group

그룹(Group)은 여러 개의 노드로 구성된 집합으로 리스트 구조를 가진다. 따라서, 새로운 노드를 리스트의 양 끝(head, tail)에 추가하여 그룹을 확장시킬 수 있다. 그룹에 속한 노드들은 Synth이거나 다른 그룹이 될 수 있는데 한꺼번에 제어가 가능하다. SC3가 실행되면 트리 구조의 시작을 나타내는 ID가 0인 최상위 그룹(group 0)가 만들어진다. 서버가 부팅되면 ID가 1인 기본 그룹(default group)이 만들어 지고 이후 생성되는 노드는 이 기본 그룹에서 출발한다.
다음의 명령을 사용하면 현재의 트리구조를 볼 수 있다.
Server.queryAllNodes;

Synth

신스(Synth)는 함께 동작하는 유닛 생성기(unit generators: UGs)의 집합이다. SC3 synthesis 엔진 명령어로 제어할 수 있으며 전역(global) 오디오, 컨트롤 버스를 통해 Synth 입출력이 발생한다. SC3 서버 명령어로 지역(local) 컨트롤이 가능하다.

Synth Definition

Synth는 Synth Definition(SynthDef)에 의해 생성된다. 신스 정의 파일은 SC3 language 어플리케이션(SC3 인터프리터)에서 만들 수 있고 SC3 서버에 로딩시켜 사용한다. 신스 정의는 이름으로 참조할 수 있다.

Audio Buses

각 신스는 서로 하나의 전역 배열 구조(global array)인 오디오 버스를 통해 오디오 신호를 주고 받는다. 오디오 버스는 0부터 시작하는 정수 배열이다. 오디오 버스를 사용하면 각 신스를 직접 연결하는 것보다 효율적인 시스템 구성이 가능하다.

Control Buses

오디오 버스가 신스 간의 오디오 신호 통신을 위한 것처럼 신스 간의 제어 명령은 컨트롤 버스를 사용한다. 오디오 버스와 마찬가지로 0부터 시작하는 정수 배열이다.

Buffers

버퍼(Buffer)는 간단한 헤더(header)를 가지는 32비트 실수 배열 구조이다. 버퍼는 SC3 엔진이 동작하는 동안에도 안전하게 메모리 할당, 로딩, 해제가 가능하다. 버퍼는 웨이브 테이블, 샘플 버퍼, 딜레이 라인, 인벨롭과 같이 실수 배열이 필요한 곳이면 어느 곳이나 사용할 수 있다. 사운드 파일은 주로 이 버퍼를 사용하게 된다.

Unit Generator (Ugen)

UGen 정의는 프로그램이 시작할 때 자동으로 읽어지는 일종의 플러그인이다. 이진코드(binary code) 라이브러리로 CSound UGen 코드, MaxMSP의 오브젝트 개념과 비슷하다.

=========================================================================
시작하기 :
post window : 시작하면 post라는 창이 하나 뜨는데 코드 실행시 결과값이나 에러메시지를 알려준다.
서버켜기 : localhost server의 boot 버튼을 누르거나 s.boot라고 치고 실행시킨다.
코드작성 및 실행 : 실행을 원하는 코드의 줄을 선택하고 enter 키를 누른다.
fn + return(OSX), control + enter(Windows)
도움말 : 오브젝트를 선택하고 command+D(OSX), F1(Windows)

Object, Message, Argument: SC는 기본적으로 다음의 형식을 사용한다.
Object.message(arguments)

예)SinOsc.ar(400);
SinOsc는 사인파를 만드는 오브젝트이고 ar은 audio rate 로 만들라는 message이고
400은 주파수를 표시한다.
위의 사인파의 소리를 들어보려면 함수로 {}넣어서 play 메시지를 주면 된다.
{SinOsc.ar(400)}.play;

  • 괄호의 용도 :

.소괄호() :수식에서는 연산 우선 순위를 지정하거나 바꿀 때와 아규먼트를 지정할때
.중괄호{} :함수를 담는다
.대괄호[] :목록의 요소를 지정할 때

Unit Generator: 오디오신호나 컨트롤신호를 발생시키는 기본 오브젝트
소리를 들어보려면 {SinOsc.ar}.play;
파형을 보려면 {SinOsc.ar}.plot;
파형과 소리를 들어보려면 {SinOsc.ar}.scope;// osx의 경우 internal server를 켠다.

SynthDef : Synth를 만드는 틀
(SynthDef(“mySynth”,      // synth의 이름
      {arg freq=200; // 매개변수(argument) 선언
       var sig;      // 변수(variable) 선언
       // 소리를 만드는 UGen의 조합 — start
        sig = SinOsc.ar(freq);
        sig = sig * EnvGen.kr(Env.perc, doneAction:2);
        sig = Pan2.ar(sig, 0, 0.5);  // Pan2.ar(in, pos, level)-스테레오로
       // 소리를 만드는 UGen의 조합 — end
Out.ar(0, sig);  // 소리를 출력하기 위해서는 Out UGen은 꼭 필요
      }
).send(s))
// load–디스크에 저장, send(s)–서버(s)에 SynthDef 전달, play–Synth를 바로 재생

Synth(“mySynth”, [‘freq’,60.midicps])// Synth로 불러본다.

Task : 순차적으로 실행시키는 설계도
(Task({loop({Synth(“mySynth”, [‘freq’,[48,52,55,59,69].midicps.choose]);
0.2.wait;})
}).start)

Pattern : Stream을 만드는 틀
예)
Pseries(0,1,8).asStream.all // Post창에 stream이 표기된다.

  • Pbind는 Symbol(\가 붙은것)과 value를 묶어준다.

(Pbind(
\instrument, “mySynth”,//Synth 지정
\degree, Pseries(0, 1, 8),//음정 지정
\dur, 0.25 // 이벤트의 기간 지정
).play;)

Advertisements