Supercollider

슈퍼콜라이더()는 음악작곡, 오디오 신디시스를 위해 1996년 James McCartney에 의해 최초로 개발된 프로그래밍 언어 및 오디오엔진이다.
Smalltalk 및 Ruby 언어 등에 영향을 받은 강력한 고수준의 문법과 소리생성, 제어를 위한 다양한 Ugen들을 제공하여 현재 Max/MSP, Pd등과 함께 가장 널리 사용되는 전자음악 도구가 되었다.
시작버젼은 MacOSX를 중심으로 개발되었으나 (GUI, IDE등이 OSX 전용 개발 프레임워크를 사용), 현재는 다양한 플랫폼에서 동일한 프로그래밍 환경을 제공하는 크로스플랫폼 어플리케이션으로 진화하였다.
2018-10-31기준으로 최신 버전은 3.9.3으로 2018-4-8일에 수정되었으며 http://supercollider.github.io를%5B깨진+링크(과거+내용+찾기)%5D 통해 다운로드할 수 있다.
http://sccode.org 와 https://github.com/supercollider/supercollider에는 유저들의 다양한 예제 코드들이 공유되고 있으며,여러 프로그래밍 방법론들을 통해 유저마다 각자만의 사용하는 방식들이 존재함을 알 수 있다.
SuperCollider는 GPL v3 기반의 완전한 오픈소스 프로그램으로, 공식적으로 배포되는 어플리케이션 외에 여러 가지 사용 환경(IDE,언어)들이 존재한다.
SuperCollider를 통해서 할 수 있는 것
아키텍처.
SC의 환경은 버전 3부터 2가지 요소로 구성되었다: Scsynth(server) , sclang(client).(위의 구성은 OSC(Open Sound Control)와 상호 통신한다.)
SuperCollider는 기본적으로 오디오엔진(소리합성)을 담당하는 scsynth(server)와 그 엔진을 제어하는 sclang(client)로 구성되어 있으며 서로 간에 OSC(OpenSoundControl) 프로토콜을 통해 제어 메시지 및 데이터를 주고 받다. 최근엔 Shared memory interface를 지원하여 서버와 클라이언트가 같은 머쉰안에 존재한다면 메모리르 통해 컨트롤 값 및 오디오데이터(forScope)를 빠르게 주고 받을 수 있다.
SuperCollider 합성 서버(scsynth).
SuperCollider의 사운드 생성은 최적화된 명령 행 실행 파일(scsynth)에 번들로 제공된다. 대부분의 경우 SuperCollider 프로그래밍 언어 내에서 제어되지만 독립적으로 사용할 수 있다. 오디오 서버에는 다음과 같은 기능이 있다.
SuperCollider 프로그래밍 언어 ( sclang ).
sclang에서 사용자가 쓰는 인간의 언어란 프로그래밍 언어를 지칭하는 것으로서, 실제 인간의 언어 또는 사고 체계와 비슷한 체계를 가지는 객체지향(OOP, Object-oriented Programming)이라는 특징을 가진 언어이며, 매우 다양한 표현 능력을 우리에게 제공한다. 이것을 높은 레벨(high-level)의 언어라고 한다. 이것은 sclang의 해석기에 의해 OSC 메시지 형태로 해석되는데, 이것을 낮은 레벨(low-level)의 언어라고 한다.
sclang은 이 두 가지 언어를 모두 다룰 수 있게 해 준다.
즉, 우리는 OOP의 높은 레벨의 언어를 이용해서 주문서를 작성할 수도 있고, 또는 .sendMsg 또는 다른 비슷한 단어들을 이용해서 낮은 레벨인 OSC 메시지의 형태로 서버에 직접 전달할 수도 있다.
우리가 흔히 사용하는 방법은 당연히 OOP의 풍부한 문법을 이용하는 높은 레벨의 언어이며, 특정 경우에는 OSC 메시지 형태를 사용하는 것이 더 편리할 때도 있다. (예를 들어, 단순 플레이 후 스스로 할당에서 제외해야 하는 수많은 그레인들을 만들 때.)
GUI 시스템.
ixiQuarks GUI 도구를 실행하는 SuperCollider의 스크린 샷
인터페이스 및 시스템 지원.
클라이언트.
서버는 OSC(Open Sound Control)를 사용하여 제어되기 때문에 다양한 응용 프로그램을 사용하여 서버를 제어 할 수 있다. SuperCollider의 언어 환경이 일반적으로 사용되지만 Pure Data와 같은 다른 OSC 인식 시스템을 사용할 수 있다.
SuperCollider 서버에대한 “타사” 클라이언트가 존재한다. 여기에는 Haskell, ScalaCollider, Scala기반의 Scheme 클라이언트인 hsc3, Clojure 및 Sonic Pi를 기반으로 한 Scala, Overtone을 기반으로 하는 rs3가 있다. 이것들은 SuperCollider의 프로그래밍언어에 대한 인터페이스를 제공하지 않기 때문에 밑에 언급하게 될 개발환경과 구별된다.
대신 오디오 서버와 직접 통신하고 사용자 표현을 용이하게 하는 고유한 방식을 제공한다.
서버 구조의 장점과 단점.
단점.
더 구체적으로 예를 들면, 버퍼를 하나 마련해서 큰 사운드파일을 거기에 불러오게 한 후 그 버퍼의 내용을 가지고 소리를 만들고자 할 경우, 버퍼 마련과 사운드파일을 그 버퍼에 불러오는 데에 시간이 걸리기 때문에, 즉시 그 버퍼를 가지고 처리를 하려고 하면, 내용이 아직 없는 관계로 에러가 나게 된다. 그럴 경우에는 버퍼 준비가 끝났다는 것을 서버가 클라이언트 측으로 다시 메시지를 보내올 필요가 있고, 그렇게 서버로부터 연락이 왔을 때 일을 시작하게끔 해야 한다. 그러한 비동시적이라는 문제를 해결하기 위해서 많은 경우 action, comletionMessage가 아규멘트로 마련되어 있고, 또는 의도적으로 시간을 지연 시켜서 처리하게 한다.
지원되는 운영체제.
SuperCollider는 macOS, 리눅스, Windows, FreeBSD 및 OpenSUSE에서 실행된다.
각 운영체제에는 SuperCollider와 함께 사용할 수 있는 여러 가지 언어 편집환경과 클라이언트가 있다.
SuperCollider는 Android 및 iOS에서 실행이 가능한다.
편집 환경.
SuperCollider 코드는 자신의 IDE(리눅스, Mac 및 Windows를 지원)내에서 가장 일반적으로 편집되고 사용된다.
SuperCollider를 지원하는 다른 개발환경은 다음과 같다.
코드예제.
// Print "Hello world!"
"Hello world!".postln;
// Play a mixture of an 800 Hz sine tone and pink noise
// Modulate a sine frequency and a noise amplitude with another sine
// whose frequency depends on the horizontal mouse pointer position
 var x = SinOsc.ar(MouseX.kr(1, 100));
 SinOsc.ar(300 * x + 800, 0, 0.1)
 + PinkNoise.ar(0.1 * x + 0.1)
}.play;
// List iteration: multiply the elements of a collection by their indices
[1, 2, 5, 10, -3].collect { |elem, idx| elem * idx };
// Factorial function
f = { |x| if(x == 0) { 1 } { f.(x-1) * x } };
서버 사용하는 방법.
주요 인스턴스 변수/메쏘드.
주의 :
서버를 부팅했는데, 사용자가 원하는 오디오 인터페이스로 부팅이 안될 때에는 시스템의 오디오 디폴트 장치를 바꿔줘야 한다. OSX 에서는 "Audio MIDI Setup.app" 또는 "System Preferences"의 "Sound"에서 인/아웃풋 장치를 바꿔준 후에 서버를 재부팅해야 한다. 또는 "Alt+메뉴바의 스피커 클릭"을 통해서도 인/아웃풋 장치를 바꿀 수 있다.
오류 메시지 설명.
다음을 실행하면 포스트창에 오류 메시지가 뜬다.
100.babo(10); // 이 줄에 커서를 위치시키고, 'Shift + backspace'
일반적인 오류 메시지는 크게 세 부분 또는 네 부분으로 되어 있고 위에서부터 다음의 순서로 되어 있다.
또는, 다음과 같이 단순한 기호누락이거나, 정의가 안된 변수를 쓰는 경우에 점(•)으로 문법적인 오류를 지적해 준다.
포스트 창에 뜨는 오류 메시지 중에 다음 부분이 있는데, 이것은 점이 있는 앞 부분에 문법적인 문제가 있음을 표현하는 것이다.
여기에서는 쉼표(,)가 빠졌음을 표시해 주고 있다.