2017/04/30

SuperColliderで音を出す

音を出して計器類でファンシーに表示しつつSynthDefします。


音を出す

とりあえずサイン波を出します。入力したコードを範囲選択してCtrl+Returnで実行できます。

{ SinOsc.ar(1000, 0, 1) }.play;

SinOsc.ar(周波数, 位相, 音量) となっています。

SuperColliderでは書き方のスタイルがいろいろあります。以下の書き方でも、上の例と同じ意味になります。

play{ SinOsc.ar(1000, 0, 1) };
play({ SinOsc.ar(1000, 0, 1) });
play({ ar(SinOsc, 1000, 0, 1) });

次はステレオにします。

{ [SinOsc.ar(1000, 0, 0.2), SinOsc.ar(1111, 0, 0.2)] }.play;

[チャンネル1, チャンネル2, ...] となっているようです。

Mixを使えば音を混ぜることができます。

{
  Mix([
    [SinOsc.ar(200, 0, 0.10), SinOsc.ar(202, 0, 0.10)],
    [SinOsc.ar(300, 0, 0.11), SinOsc.ar(303, 0, 0.11)],
    [SinOsc.ar(500, 0, 0.13), SinOsc.ar(505, 0, 0.13)],
    [SinOsc.ar(700, 0, 0.16), SinOsc.ar(707, 0, 0.16)],
    [SinOsc.ar(1100, 0, 0.20), SinOsc.ar(1111, 0, 0.20)],
    [SinOsc.ar(1300, 0, 0.25), SinOsc.ar(1313, 0, 0.25)]
  ]) * 0.1 // 音量調整。
}.play;

Synthdef, Symbol, Key Value Pairs

SynthDefでサーバ側にシンセを追加できます。追加したシンセは Synth.new(\name) で呼び出せます。

SynthDef.new(
  \mysyn,
  { |freq(440), amp(0.5)|
    var osc = SinOsc.ar(freq, 0, amp);
    Out.ar(0, [osc, osc])  // ステレオ。
  }
).add;

~synth = Synth.new(\mysyn, [freq: 200, amp: 0.1]);

\mysyn など \ から始まっているものはSymbolと呼びます。上の例ではSymbolをStringに置き換えても同じ動作になります。

[freq: 200, amp: 0.1] のようなArrayをKey Value Pairsと呼びます。 ["freq", 200, "amp", 0.1][\freq, 200, \amp, 0.1] も同じ意味です。

~ から始まる名前は currentEnvironment に所属する環境変数となります。

オシロスコープなど

Serverにオシロスコープなど計器類のGUIが用意されています。メニューのLanguage > Show Scopeなどからも表示できます。

s.scope;     // オシロスコープ
s.freqscope; // スペクトラムアナライザ
s.meter;     // 音量メータ
s.plotTree;  // node, groupの表示
s.makeGui;   // サーバの状態

オシロスコープの色を変えます。

~scope = s.scope;
~scope.scopeView.background = Color.white;
~scope.scopeView.waveColors = Array.fill(
  s.options.numOutputBusChannels,
  Color.grey
);

スペクトラムアナライザの大きさを変えます。

{ |width(1024), height(768)|
  var windowFreqscope = Window("My Analyzer", Rect(0, 0, width, height));
  var freqscope = FreqScopeView(windowFreqscope, windowFreqscope.view.bounds);
  freqscope.background = Color.white;  // 背景色。
  freqscope.waveColors = [Color.grey]; // 描画色。
  freqscope.inBus = 0;                 // 入力チャンネル。
  freqscope.freqMode = 1;              // 0 = 線形, 1 = 対数。
  freqscope.dbRange = 96;              // 音量レンジ。
  freqscope.active = true;
  windowFreqscope.onClose_({ freqscope.kill });
  windowFreqscope.front
}.value;