SuperColliderのクラスメモ

単なるメモ
特に難しいことはないかと

クラスファイル側

/* 0. はじめに  */
MyClassPre{
}

/* 1. 変数 */

	/*	
	変数の宣言はいつもどおりvar
	<でゲッター、ゲッターはオブジェクトの外側から変数の値を取得できるようにする
	>でセッター、セッターはオブジェクトの外側から変数の値を設定できるようにする
	*/
	
MyClassVar {
	var <>x;
	var y;
}

/* 2. メソッド */
MyClassMethod {
	var <>x;
	/* 
	*付きでクラスメソッド
	クラスメソッドとは、インスタンスを生成しなくても直接クラスから呼び出せるメソッド
	*/
	*new{
		^super.new //ここでのsuperはobject。help->class browserのsuperボタンを押してもわかる
	}
	
	/*
	*なしでインスタンスメソッド
	インスタンスメソッドとは、インスタンスから呼び出すメソッド
	*/
	postMethod {
		^x.postln;
	}
	
	/*
	argで引数
	^で戻り値
	*/
	postMethod2{
		arg a,b;
		var c = a+b;
		^c.postln;
	}
}

/* 3. ちょっと書いてみる */
//Objectは勝手に継承
SynthPlusFilter{
	var <>mysyn,<>myfilter;
	var >freq=440,>q=1.0,>mul=1.0,>add=0.0;
	*new{
		arg mysyn,myfilter;
		^super.newCopyArgs(mysyn,myfilter);
	}
	play{
		play{myfilter.ar(mysyn.ar(),freq,q,mul,add);}
	}
}

/* 4. もうちょい書いてみる */
SubSynthDef{
	var <>defName,<>mysyn1,<>mysyn1Param,<>myfilter,<>myfilterParam,<>myenv;
	*new{
		arg defName,mysyn1,myfilter,myenv;
		^super.newCopyArgs(defName,mysyn1,myfilter,myenv);
	}
	def{
		arg bus=0, pan=0;
		SynthDef(defName,{
			var signal,envelope,filter,out;
			mysyn1Param.postln;
			signal=mysyn1.ar(mysyn1Param);
			filter=myfilter.ar(signal,myfilterParam);
			envelope=EnvGen.ar(myenv,doneAction:2);
			Out.ar(bus,
				Pan2.ar(envelope*filter,pan);
			);
		}).store;
	}
	play{
		Synth(defName).play;
	}
}

rtf側

/*0. はじめに*/
/*
	.scのファイル名でクラスファイルを作る
	保存する場所は
*/
Platform.userExtensionDir;
//保存したらmenu->Lang->compile library(もしくはpostウィンドウでcmd+K)して、下が実行できればおk
MyClassPre

/*1. 変数*/
(
	var test =MyClassVar.new;
	test.x = 1;		//test.x_(1);も同じ意味
	test.x.postln;
	//test.y = 2;	//NG
	//test.y;	//NG
)

/*2. メソッド*/
(
	var test = MyClassMethod.new;
	test.x_(10);
	test.postMethod;
	test.postMethod2(1,2);
	//var ngTest = MyClassMethod.postMethod;
	//test.new;
)

/* 3. ちょっと書いてみる */
//継承とか色々あるけれど、上記だけで簡単なクラスは書ける。特に意味はないクラスだけど
//newは省略できる
(
	var test1 = SynthPlusFilter(WhiteNoise,RLPF);
	var test2 = SynthPlusFilter(SinOsc,RHPF);
	test1.freq_(220).mul_(0.5).play;
	test2.freq_(1000).play;
	test1.mysyn.postln;	test2.mysyn;
	
	//以下と同じこと
	//{RLPF.ar(WhiteNoise.ar(),220,mul:0.5)}.play;
	//{RHPF.ar(SinOsc.ar(),1000)}.play;
)

/* 4. もうちょっと書いてみる */
//さらに意味はないクラスだけど、ちょっとすっきり
(
	var test1 = SubSynthDef('subtest1',
		SinOsc,[440,0.8,0],
		RLPF,[220,1.0,1.0,0.0],
		Env.perc(0.01,0.4)
	);
	var test2 = SubSynthDef('subtest2',
		Blip,[440,110,0.5,0],
		RHPF,[1000,1.0,1.0,0.0],
		Env.perc(0.1,1.0)
	);
	test1.def();
	test2.def();
	test1.play;
	test2.play;
)

以上

継承などをうまくつかっていくと表のコードはすっきりきれいに早く書けます。
でも、クラスライブラリ充実しているから別に自分で書かなくても良いと思います。ライブコーディングやる場合、あらかじめ自分でクラス書いておくと、かなり早くなりそうですね。