SC3とRosegardenを一緒に使おう

スパコでシーケンスを書く,というのは結構面倒だったりしますよね.特殊なシーケンスはスパコとかMax/Mspじゃないと書けませんが,普通のシーケンスならシーケンサーでざっと打ち込みたいかと思います.そんなわけで,スパコでシンセを書いて,シーケンサーで音を鳴らす方法です.単にMIDIを使うだけですが・・・・・・.

jack,rosegarden,スパコという構成となっています.まずはjack,rosegardenを立ち上げましょう.rosegardenの方で,スタジオ>MIDIバイスの管理>(再生デバイス)新規 で新しいデバイスを追加し,SuperColliderとでも名前を変えます.jackのconnectのALSAタブを見てみるとrosegardenが追加されていると思います.次にスパコの方で以下を実行します.

(
var inPorts = 2;
var outPorts = 1; //MIDI出力使わないなら0でも良い
MIDIClient.init(inPorts,outPorts);
//jackで接続するから以下不要
//inPorts.do({arg i;
//	MIDIIn.connect(i,MIDIClient.sources.at(i));
//});
)

jackのconnectのALSAタブにSuperColliderが追加されますので,先ほど追加したrosegardenの"SuperCollider"OutputとSuperColliderのInputを接続しましょう.丁度こんな感じです.(Audiophile2496,Keystaton(radium49です)とM-Audioばっかりですw)

次に,スパコでシンセを書いて,MIDIチャンネル別のmidiノートやベロシティをシンセのfreqとかmulに送るようにしましょう.以下のようにチャンネル1はmiditest1,チャンネル2はmiditest2用に,とかですね.MIDIノートオフでEnvGenのgateを0にするのをお忘れなく.

(
SynthDef("miditest",{
	arg freq = 440, gate = 1,amp = 1, pan = 0;
	var env,signal;
	env = Env.adsr(0.01,0.2,0.4,0.1,1,-3);
	signal = SinOsc.ar(freq,0,amp);
	Out.ar(0,
		Pan2.ar(EnvGen.ar(env,gate, doneAction:2) * signal,pan)
	);
}).store;
SynthDef("miditest2",{
	arg gate = 1,amp = 1, pan = 0;
	var env,signal;
	env = Env.perc(0.01,0.8,1,-3);
	signal = SinOsc.ar(32.midicps + rand(-0.001,0.001) ,0,amp);
	Out.ar(0,
		Pan2.ar(EnvGen.ar(env,gate, doneAction:2) * signal,pan)
	);
}).store;
)

(
var x,keys,keys2;
keys = Array.newClear(128);
keys2 = Array.newClear(128);

//MIDIノートオン
MIDIIn.noteOn = {arg src, chan, num, vel;
	var node,node2;	
	//MIDIチャンネル別にわける
	switch(chan,
		0,{ 
			node = Synth.tail(nil,"miditest",
				[
					\freq, num.midicps,\amp, vel/127
				]
			);
			keys.put(num,node);
		},
		1,{
			//[chan,num,vel].postln;
			node2 = Synth.tail(nil,"miditest2",
				[
					\amp, vel/127
				]
			);
			keys2.put(num,node2);
		}
	);
};
//MIDIノートオフ
MIDIIn.noteOff = {arg src, chan, num ,vel;
	var node,node2;
	node = keys.at(num);
	node2 = keys2.at(num);
	//("noteOff" + [chan,num,vel]).postln;
	switch(chan,
		0,{
			if(node.notNil,{
				keys.put(num,nil);
				s.sendMsg("n_set", node.nodeID, \gate,0);
			});
		},
		1,{
			if(node2.notNil,{
				keys2.put(num,nil);
				s.sendMsg("n_set", node2.nodeID, \gate,0);
			});
		});
};
)

後はrosegardenの方で,トラックパラメータ>再生パラメータ>デバイスを先ほど作った"SuperCollider"にしてやり,インストゥルメントパラメータのチャンネルを変更します.

これで,rosegardenの方でシーケンスを打ち込み,スパコのシンセを鳴らすことができます.rosegardenの方からシンセのパラメータをいじりたい場合には,コントロールイベントを送ってやれば良さそうですね.外部のMIDI音源を使うのは面倒という性格ですので,この構成は意外と便利です.