2009年11月21日 星期六

SuperCollider 3 Server Tutorial

SuperCollider 3 Server Tutorial

このチュートリアルのあとにはServer-ArchitectureServer-Command-Reference

続くのが良いでしょう。

SC3のSynthDefはSC2でのSynth 作成に非常に似ており、このチュートリアルはあなたがSuperCollider2に精通しているものと仮定します。

SuperColliderには2つのパートがあります。1つは言語部分で、他はシンセシスサーバでこれは言語の中でもまた同じコンピュータ内の分かれたプログラムでもまたネットワークを介した別のコンピュータでも動作します。言語部分はオープンサウンドコントロールの仕様に則ってシ

ンセシスサーバにメッセージを送ります。

Booting a Server(シンセシスサーバを起動する)

実際に音を出すにはまずシンセシスサーバを起動する必要があります。もっとも簡単は方法はシンセシスサーバウインドウの "Start Server"ボタンを押す事です。時にコードを書く方が有効な場合があります。そのために、定義されたインターナルとローカルの2つのシンセシスサーバに起動のメッセージを送るオブジェクトを用意します。

インターナルサーバはスーパーコライダーとして同じ様に動作します。それ自身がスーパーコライダーのプログラムです。

変数 S をインターナルサーバに定義します。

s = Server.internal;

重要:この構文は変数 S を定義するために実行しなければなりません。あなたのコンピュータ環境により違いはありますが、 MacOSXではカーソルを構文上に置き、テンキーのエンターキーを押します。リターンキーでは動作しません。これは複数行のコードでも有効です。複数行のコードの実行は、コード全体を選択し、エンターキーを押します。手軽にするには、カッコで括られたコード全体はその中の1部分をクリックすることで選択できます。( linux や WindowsではそれぞれのOSにおいてのドキュメントを参照してください。)

ローカルサーバはスーパーコライダーとして同じ様に動作します。しかし、'scsynth'とは分かれています。

変数 S をローカルナルサーバに定義します。

s = Server.local;

サーバを起動するために起動メッセージを送ります。

s.boot;

サーバを終了するために終了メッセージを送ります。

s.quit;

サーバを起動しましょう。サーバを起動するにはIPアドレスとポートナンバーを提供する必要があります。ポートナンバーは任意ですが telnet, ftp httpなどの一般の通信とぶつからないようにしなければなりません。IPアドレス 127.0.0.1はローカルホストとして定義されています。これはあなたのコンピュータ自身のサーバのIPアドレスです。

#58009のポート番号を使ってローラルサーバを定義します。

s = Server(\myServer, NetAddr("127.0.0.1", 58009));

s.boot;

s.quit;

これではリモートでシンセシスサーバを起動することはできません。しかし、すでにコンピュータの用意があるならメッセージを送ることができます。シンセシスサーバの動作するコンピュータのIPアドレスに任意のポートを使いサーバを定義します。

#57110のポート番号を使って、IPアドレス192.168.0.47を持つコンピュータのシンセシスサーバを定義します。

s = Server(\myServer, NetAddr("192.168.0.47", 57110));

Making Sound(音を出す)

(注:このチュートリアルではSynthクラスはグループよりもServer-Command-Referenceで記述されているOSCコマンドを使います。それらのヘルプファイルにはSynthを使う上でのいくつかの簡単は方法を示しています。このチュートリアルでは基礎的はSynthとSynthDefを説明します。

それでは始めましょう。

変数 S にアサインします。

s = Server.local;

起動します。

s.boot;

SynthDefを作ります。SynthDefはサーバに動作させるモジュールを記述したものです。SynthDefはオーディオバスからはオーディオを、コントロールバスからはコントロールを読み、バスに戻します。それではサインオシレータを作り、オーディオバス0に送りましょう。

(

SynthDef("sine", {

var osc;

osc = SinOsc.ar(800, 0, 0.1); // 800 Hz sine oscillator

Out.ar(0, osc); // send output to audio bus zero.

}).writeDefFile;

)

SynthDefをサーバに送ります。

s.sendSynthDef("sine");

音を出します。 /s_newコマンドはSynthDefにある"sine" シンセを新しく作ります。それぞれのシンセはサーバ上で独自のIDが必要です。ここではIDに1000と与えましょう。それぞれのシンセはグループにインストールされる必要があります。ここでは最上位のグループである0をインストールしましょう。

s.sendMsg("/s_new", "sine", 1000, 1, 0);

音を止めます。

s.sendMsg("/n_free", 1000);

サーバを終了します。

s.quit;

Using Arguments(引き数を使う)

シンセをつくるときにパラメータを指定できるのは便利です。"sine" シンセに周波数のアーギュメントを加えてみましょう。

s = Server.local;

s.boot;

(

SynthDef("sine", { arg freq;

var osc;

osc = SinOsc.ar(freq, 0, 0.1); // 800 Hz sine oscillator

Out.ar(0, osc); // send output to audio bus zero.

}).writeDefFile;

)

s.sendSynthDef("sine");

900 Hz のサイン波を出す。

s.sendMsg("/s_new", "sine", 1000, 1, 0, "freq", 900);

s.sendMsg("/n_free", 1000);

1000 Hzのサイン波を出す。

s.sendMsg("/s_new", "sine", 1001, 1, 0, "freq", 1000);

s.sendMsg("/n_free", 1001);

3つを同時に。

(

s.sendMsg("/s_new", "sine", 1000, 1, 0, "freq", 800);

s.sendMsg("/s_new", "sine", 1001, 1, 0, "freq", 1001);

s.sendMsg("/s_new", "sine", 1002, 1, 0, "freq", 1202);

)

(

s.sendMsg("/n_free", 1000);

s.sendMsg("/n_free", 1001);

s.sendMsg("/n_free", 1002);

)

カッコ(カッコとカッコで括るのをバンドルと呼びます)を使い3つを同時に実行します。バンドルは時間軸に沿って複数のメッセージを送ります。バンドル内のメッセージは同時に実行されます。sendBundleのタイムアーギュメントオフセットとして実行を遅らせることが出来ます。

(

s.sendBundle(0.2,

["/s_new", "sine", 1000, 1, 0, "freq", 800],

["/s_new", "sine", 1001, 1, 0, "freq", 1001],

["/s_new", "sine", 1002, 1, 0, "freq", 1202]);

s.sendBundle(1.2, ["/n_free", 1000],["/n_free", 1001],["/n_free", 1002]);

)

Controlling a Synth(シンセをコントロールする)

シンセにメッセージを送ることでアーギュメントの値を更新出来ます。

900 Hz のサイン波を出す。

s.sendMsg("/s_new", "sine", 1000, 1, 0, "freq", 900);

/n_set コマンドで周波数を変化させましょう。ノード ID、パラメータ名、値を送ります。

s.sendMsg("/n_set", 1000, "freq", 800);

s.sendMsg("/n_set", 1000, "freq", 700);

s.sendMsg("/n_free", 1000);

Adding an Effect Dynamically(ダイナミックにエフェクトを加える)

ダイナミックにエフェクトを追加したり削除したり出来ます。このためにはシンセのノードが実行された後、エフェクトが加えられなければいけません。

ノイズパルスを定義します。

(

SynthDef("tish", { arg freq = 1200, rate = 2;

var osc, trg;

trg = Decay2.ar(Impulse.ar(rate,0,0.3), 0.01, 0.3);

osc = {WhiteNoise.ar(trg)}.dup;

Out.ar(0, osc); // send output to audio bus zero.

}).writeDefFile;

s.sendSynthDef("tish");

)

エコーエフェクトを定義します。

(

SynthDef("echo", { arg delay = 0.2, decay = 4;

var in;

in = In.ar(0,2);

// ReplaceOut を使い、バスの以前の内容を更新します。

ReplaceOut.ar(0, CombN.ar(in, 0.5, delay, decay, 1, in));

}).writeDefFile;

s.sendSynthDef("echo");

)

ノイズパルスを実行します。

s.sendMsg("/s_new", "tish", 1001, 1, 0, \freq, 200, \rate, 1.2);

エコーエフェクトを追加します。

s.sendMsg("/s_new", "echo", 1002, 1, 0);

エコーエフェクトを終了します。

s.sendMsg("/n_free", 1002);

エコーエフェクトを追加します。(time has come today.. hey!)

s.sendMsg("/s_new", "echo", 1002, 1, 0, \delay, 0.1, \decay, 2);

エコーエフェクトを終了します。

s.sendMsg("/n_free", 1002);

ノイズパルスを終了します。

s.sendMsg("/n_free", 1001);

シンセノードの後にエフェクトを追加する方法です。他には、グループや/n_afterコマンドを実行されるシンセの後に追加するエフェクトを確定するのに使います。

Chaining Effects

Using Control Buses

Mapping an Argument to a Control Bus

(コントロールバスにアーギュメントを配置する)

コントロールを定義する。

(

SynthDef("line", { arg i_bus=10, i_start=1000, i_end=500, i_time=1;

ReplaceOut.kr(i_bus, Line.kr(i_start, i_end, i_time, doneAction: 2));

}).writeDefFile;

s.sendSynthDef("line");

)

900 Hz のサイン波を出す。

s.sendMsg("/s_new", "sine", 1000, 1, 0, "freq", 900);

コントロールバス #10に周波数の値を置く。

s.sendMsg("/c_set", 10, 1000);

コントロールバス #10を読み込むためにノードのfreqアーギュメントを配置する。

s.sendMsg("/n_map", 1000, \freq, 10);

コントロールバス #10の値を変化する。

s.sendMsg("/c_set", 10, 1200);

コントロールバス #10に実行するノードをスタートします。EnvGen doneActionは動作が終了すると自動的にノードを解放します。

s.sendMsg("/s_new", "line", 1001, 0, 0);

ノードを解放する。

s.sendMsg("/n_free", 1000);

沒有留言:

張貼留言

推到 Twitter!
推到 Plurk!
推到 Facebook!