音を出して計器類でファンシーに表示しつつ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;