FoxDotからSuperColliderをいじくる

FoxDotからSuperColliderを直接操作する方法について書きます。

FoxDot動かしているエディタで下記のコードを実行します。

from .SCLang.SynthDef import FileSynthDef

こちらを実行することによりSuperColliderをいじくる準備ができます。

そして下記のような感じでSynthを定義します。※#の行はコメント

# シンセの名前を定義
synthtest = SynthDef("synthtest")
# ここにSuperColliderのコードを書く
synthtest.osc=SinOsc.ar(440)
# シンセを追加
synthtest.add()

順を追って解説します。

# シンセの名前を定義
synthtest = SynthDef("synthtest")
synthtestは好きなシンセの名称を書きます。SynthDef("")に記載する名称と同じものが望ましいです。

# ここにSuperColliderのコードを書く
synthtest.osc=SinOsc.ar(440)
今回はテストなので440Hzのサイン派がなるだけのシンセです。

# シンセを追加
synthtest.add()
ここまでうまく実行できるとSuperCollider側のPostWindowにこんなログが表示されます。
Loading SynthDef from <FoxDotのインストールパス>\FoxDot\osc\scsyndef/synthtest.scd

そして該当の パスにsynthtest.scdというファイルが生成されます。
これはシンセの定義ファイルとなります。
中身を見てみるとこんな感じでした。

SynthDef.new(\synthtest,
{|amp=1, sus=1, pan=0, freq=0, vib=0, fmod=0, rate=0, bus=0, blur=1, beat_dur=1, atk=0.01, decay=0.01, rel=0.01, peak=1, level=0.8|
var osc, env;
sus = sus * blur;
freq = In.kr(bus, 1);
freq = [freq, freq+fmod];
osc=SinOsc.ar(440);
osc = Mix(osc) * 0.5;
osc = Pan2.ar(osc, pan);
	ReplaceOut.ar(bus, osc)}).add;

詳細はSuperColliderの話になってくるので割愛しますが、下から4行目の

osc=SinOsc.ar(440);

がFoxDotから追加したコードとなります。
あとは使いやすいようにFoxDotが自動で入れてくれているコードです。

実際に音を出してみます。
FoxDotで通常のSynthを鳴らすコードと同じ書き方です。
※少し音量が大きいかもしれませんので注意

s1>>synthtest(0,dur=1)

ここでは詳しくは割愛しますがsynthtestで今までのコードで定義したシンセを指定して鳴らします。dur=1なので1Clock進むごとに1回、シンセ(440Hzのサインが波)が鳴ります。終わりを定義していないので音はクリップします。

少しずつコードを改変していきます。

# シンセの名前を定義
synthtest = SynthDef("synthtest")
# ここにSuperColliderのコードを書く
synthtest.osc=SinOsc.ar(440)*Saw.kr(10)
# シンセを追加
synthtest.add()
s1>>synthtest(0,dur=1)

変更箇所は下記の部分です。

synthtest.osc=SinOsc.ar(440)*Saw.kr(10)

単純な440Hzのサイン派にノコギリ波でモジュレーションをかけていきます
440や10の数値をいじくると波形が変わって音が変化します。

さらに改変します。

# シンセの名前を定義
synthtest = SynthDef("synthtest")
# ここにSuperColliderのコードを書く
synthtest.osc=SinOsc.ar(440)*Saw.ar("MouseX.kr(1,20)")
# シンセを追加
synthtest.add()
s1>>synthtest((0,0),dur=2/PTri(5),drive=0.1).spread(0.1).every(8,"stutter",4)

SuperColliderのコードでMouseX.kr(1,20)としてやるとマウスのX座標を読み取り1~20の範囲に計算しなおしてノコギリ波のパラメータとして渡してくれます。

synthtest.osc=SinOsc.ar(440)*Saw.ar("MouseX.kr(1,20)")

こちらは詳細は省きますがFoxDotのシーケンスを複雑にして、歪みのエフェクトとpanの分離を広げています。

s1>>synthtest((0,0),dur=2/PTri(5),drive=0.1).spread(0.1).every(8,"stutter",4)

私はSuperColliderはそれほど詳しくないのですが、下記のKuRiKuRoさんのnoteがとても参考になって、面白いのでお勧めです。

SuperColliderでシーケンスを組むのはハードルが高そうなんですが、FoxDotだと強力なシーケンス関数が色々と用意されているのでdur=に続いて記載すると複雑なシーケンスをライブコーディングで組めます。

また、FoxDotが割と曲線的な音色変化を付けるのが難しいんですが、MouseXなどをシンセに組み込むことで表現力を加えることができます。

最後に最近作った曲で使っているお気に入りのfeedback サイン波のコードを書いておきます。
いい感じの低音ノイズが時間変化で徐々に変化していって気に入ってます。

Clock.bpm=104
# cloud
sinefb = SynthDef("sinefb")
sinefb.osc = SinOscFB.ar(sinvar([50,300],100,start=now), sinefb.rate)
sinefb.add()
s1 >> sinefb(0,oct=(5,4,3), rate=linvar([0,2],32,start=now), dur=1/4,output=14,echo=0.25,sus=0.125)+(0,200)
# s1.solo()
s2 >> sinefb(0,oct=(5,4,7), rate=linvar([0,1],64,start=now), dur=1/4,output=16,echo=0.25,sus=0.125)+(0,100)


この記事が気に入ったらサポートをしてみませんか?