狠狠撸

狠狠撸Share a Scribd company logo
Interactive Music II
SuperCollider応用
JITLib - ライブコーディング 2
2013年11月28日
東京藝術大学芸術情報センター(AMC)
田所 淳
今日の内容
? JITlibを使用した、SuperColliderライブコーディングつづき
? より高度なライブコーディングに挑戦!
先週の復习
ライブ?コーディング
? ライブ?コーディング (Live Coding) とは?
!

? 「on-the-?y programming」「just in time programming」
? 即興的にプログラミングを行う
!

? コンピュータ音楽、CGアニメーションなどで多くの試み
ライブ?コーディング
? ライブコーディングに対応した言語
!

?
?
?
?
?
?
?
?

SuperCollider
ChucK
COLT
Impromptu
Pure Data
Max
LiveCode
Fluxus
ライブ?コーディング
? 参考サイト: TOPLAP
ライブ?コーディング
? Study In Keith - A livecoding performance by Andrew Sorensen
SuperColliderで、ライブコーディング
? JITlibとは?
? 標準のsupercolliderサーバ?リリースとともに配布されるサー
ド?パーティ?ライブラリの1つ
? SuperCollider (SCLang) にライブコーディング機能を追加
? 参考: http://doc.sccode.org/Overviews/JITLib.html
SuperColliderで、ライブコーディング
? 一般のSuperColliderでのコード作成イメージ
SuperColliderで、ライブコーディング
? 一般のSuperColliderでのコード作成イメージ

楽器の全てを定義
SuperColliderで、ライブコーディング
? 一般のSuperColliderでのコード作成イメージ

楽器の全てを定義

最終結果のシグナルを出力へ

出力
SuperColliderで、ライブコーディング
? SuperCollider + 闯滨罢尝颈产でのコード作成イメージ
SuperColliderで、ライブコーディング
? SuperCollider + 闯滨罢尝颈产でのコード作成イメージ

出力

まず始めに
最終出力を作成
SuperColliderで、ライブコーディング
? SuperCollider + 闯滨罢尝颈产でのコード作成イメージ

Node

ノートを出力に送ると
すぐに音が生成される

出力
SuperColliderで、ライブコーディング
? SuperCollider + 闯滨罢尝颈产でのコード作成イメージ

Node

Node

複数のNodeを
ミックス可能

出力
SuperColliderで、ライブコーディング
? SuperCollider + 闯滨罢尝颈产でのコード作成イメージ

Node
Node

出力

Nodeを後から
入れ替えも可能
SuperColliderで、ライブコーディング
? SuperCollider + 闯滨罢尝颈产でのコード作成イメージ

Node

Node

Node

Node

Node
出力結果を常に聞きながら
複雑な構造を構築できる

出力
SuperColliderで、ライブコーディング
? JITlibモードに入る、元に戻る
//セットアップ。これによって「jitlibモード」に入る	
p= ProxySpace.push(s);	

!
//通常のsc langに戻るには	
p.pop;	

!
SuperColliderで、ライブコーディング
? NodeProxy サーバーで処理する場所を確保する
//「~ + 変数名」はサーバーで処理される何かの場所を確保する(NodeProxy)	
//ugen関数、静的な数、pbind、lfoなどを入れることが可能	

!
//例えば、UGenのひとつSinOscの出力結果をNodeProxyに入れる	
~out = {SinOsc.ar};	

!
//proxyspaceに定義したもののリストを見る	
p;	

!
//ProxySpaceに定義したものを再生する	
~out.play;
SuperColliderで、ライブコーディング
? Proxyの置き換え、クロスフェード
//プロキシの中に現在あるものを別のugen関数で置き換える	
~out = {SinOsc.ar([220, 222], 0, 0.5)};	

!
//クロスフェードの時間を設定	
~out.fadeTime = 4;	

!
//クロスフェードしながら、別のUgenに置き換え	
~out = {SinOsc.ar([300, 333], 0, 0.5)};	

!
//無音にフェードアウト	
~out.release;
SuperColliderで、ライブコーディング
? 簡単な実例: アルゴリズミックハーモニー
//アルゴリズミック?ハーモニーをライブコーディングで!	
~out = {Mix.arFill(24,{SinOsc.ar([220,221]*(3.0/2**rrand(1,6))*(0.5**
rrand(1,6)),0,1.0/24)})};	
~out = {Mix.arFill(24,{SinOsc.ar([220,221]*(4.0/3**rrand(1,6))*(0.5**
rrand(1,6)),0,1.0/24)})};	
~out = {Mix.arFill(24,{SinOsc.ar([220,221]*(5.0/3**rrand(1,8))*(0.5**
rrand(1,6)),0,1.0/24)})};	
~out = {Mix.arFill(24,{SinOsc.ar([220,221]*(9.0/8**rrand(1,20))*(0.5**
rrand(1,6)),0,1.0/24)})};
尝滨罢尝颈产のサンプルいろいろ
尝滨罢尝颈产のサンプルいろいろ
? いろいろなサンプルを通して、JITLibの雰囲気をつかんでいき
ましょう
? 実際にコードを実行して、音を聞きながら進めていくと、理解
しやすいと思います
尝滨罢尝颈产のサンプルいろいろ
? LITLibの準備、ProxySpaceの作成
// ProxySpaceの作成 (コードを実行する場所を確保)	
p = ProxySpace.push(s);	

!

// まず始めに出力を設定	
~out.play;
尝滨罢尝颈产のサンプルいろいろ
? NodeProxyの入れ替え
// ノードの入れ替え	
~out = { SinOsc.ar([400, 408] * 0.8, 0, 0.2) };	
~out = { SinOsc.ar([443, 600 - Rand(0,200)], 0, 0.2) };	
~out = { Resonz.ar(Saw.ar(40 + [0,0.2], 1), [1200, 1600], 0.1) 	
+ SinOsc.ar(60 * [1,1.1],0,0.2) };	
~out = { Pan2.ar(PinkNoise.ar(0.1), LFClipNoise.kr(2)) };
尝滨罢尝颈产のサンプルいろいろ
? Nodeの引数を設定
// nodeの引数を設定	
~out = { arg rate = 2; Pan2.ar(PinkNoise.ar(0.1), LFClipNoise.kr(rate)) };	
~out.set(rate, 30);	
~out = { arg rate = 2; Pan2.ar(Dust.ar(2000, 0.2), LFClipNoise.kr(rate)) };	
~out.set(rate, 2);
尝滨罢尝颈产のサンプルいろいろ
? Proxyを相互に参照
// Proxyを相互に参照	
~lfo = { LFNoise2.kr(30, 300, 500) };	
~out = { SinOsc.ar(~lfo.kr, 0, 0.15) };	
~out = { SinOsc.ar(~lfo.kr * [1, 1.2], 0, 0.1) 	
* Pulse.ar(~lfo.kr * [0.1, 0.125], 0.5) };	
~lfo = { LFNoise1.kr(30, 40) + SinOsc.kr(0.1, 0, 200, 500) };	
~out = { SinOsc.ar(~lfo.kr * [1, 1.2], 0, 0.1) };	
~lfo = 410;
尝滨罢尝颈产のサンプルいろいろ
? Proxy同士の演算
// Proxy同士の演算	
~lfo2 = { SinOsc.kr(0.5, 0, 600, 100) };	
~lfo = ~lfo2.abs;	
~lfo2 = { SinOsc.kr(1.3, 0, 600, 100) };	
~lfo3 = { LFTri.kr(0.5, 0, 80, 300) };	
~lfo = ~lfo2 + ~lfo3;	
~lfo = ~lfo3;	
~lfo = (~lfo3 / 50).sin * 200 + 500 * { LFTri.kr(~lfo.kr * 0.0015, 0, 0.1 * ~lfo3.kr
/ 90, 1) };	
~lfo3 = { Mix(~lfo2.kr * [1, 1.2]) };
尝滨罢尝颈产のサンプルいろいろ
? 出力のフィードバック
// 出力のフィードバック	
~out = { SinOsc.ar([220, 330], ~out.ar(2).reverse * LFNoise2.kr(0.5, 4pi), 0.4) };	
~out = { Impulse.ar(1 ! 2) + (~out.ar(2) * 0.99) };	
~out = { SinOsc.ar(Slope.ar(~out.ar) * MouseX.kr(1000, 18000, 1)) * 0.1 +
SinOsc.ar(100, 0, 0.1) };	
(	
~out = { var z, zz;	
z = Slope.ar(~out.ar);	
zz = Slope.ar(z);	
SinOsc.ar(Rand(300,410), z) *	
SinOsc.ar(zz * 410)	
* 0.1 + Decay2.ar(Pan2.ar(Dust.ar(600), MouseX.kr(-1,1)), 0.01, 0.05);	
}	
)
尝滨罢尝颈产のサンプルいろいろ
? 出力のフィードバック
// ミキシング	
~out1 = { SinOsc.ar(600, 0, 0.1) };	
~out2 = { SinOsc.ar(500, 0, 0.1) };	
~out3 = { SinOsc.ar(400, 0, 0.1) };	
~out = ~out2 + ~out1 + ~out3;	
~out = ~out1 + ~out2;	
~out = ~out1;	

!

// ミキシング別の方法	
~out = { SinOsc.ar(600, 0, 0.1) };	
~out.add({ SinOsc.ar(500, 0, 0.1) });	
~out.add({ SinOsc.ar(400, 0, 0.1) });	

!

// 配列の使用	
~out[1] = { SinOsc.ar(500 * 1.2, 0, 0.1) };	
~out[2] = { SinOsc.ar(400 * 1.2, 0, 0.1) };
尝滨罢尝颈产のサンプルいろいろ
? 引数のマッピング
~out = { arg freq=100, ffreq=20; SinOsc.ar(freq, SinOsc.ar(SinOsc.ar(ffreq)*ffreq,
0, pi), 0.2) };	

!

// 別のProxyを引数としてマッピング	
~lfo = { SinOsc.kr(0.3, 0, 80, 100) };	
~out.map(ffreq, ~lfo);	
~out = { arg freq=300, ffreq=20; Pulse.ar(freq * [1, 1.1] + SinOsc.ar(ffreq, 0,
freq), 0.3, 0.1) };	
~out = { arg freq=300, ffreq=20; BPF.ar(LFSaw.ar(ffreq * [1, 1.1], 0, 1), freq, 0.2)
};	
~lfo = { FSinOsc.kr(0.3, 0, 30, 200) + FSinOsc.kr(10, 0, 10) };	
~out = { arg freq=300, ffreq=20; SinOsc.ar(freq*[1,1.1], SinOsc.ar(ffreq, 0, pi),
0.1) };	

!

// クロスフェード	
~out.fadeTime = 2;	
~out.xset(freq, 9000);	
~out.xset(freq, rrand(400, 700));	
~lfo = { FSinOsc.kr(0.1, 0, 30, 100) };	
~lfo2 = { LFClipNoise.kr(3, 100, 200) };	
~lfo3 = StreamKrDur(Pseq([Prand([530, 600],1), 700, 400, 800, 500].scramble, inf) /
3, 0.2);	
~out.xmap(ffreq, ~lfo2);	
~out.xmap(ffreq, ~lfo);	
~out.xmap(ffreq, ~lfo3);
LITLib実習
? 前回、自分が作成した楽器を、JITLibで動かせるように編集
? 音を聞きながら、パラメーターを微調整してみる
? ライブコーディングをすると、便利になったか?

More Related Content

Interactive Music II SuperCollider応用 JITLib - ライブコーディング 2