Interactive Music II SuperCollider応用 JITLib - ライブコーディング 2
- 4. ライブ?コーディング
? ライブ?コーディング (Live Coding) とは?
!
? 「on-the-?y programming」「just in time programming」
? 即興的にプログラミングを行う
!
? コンピュータ音楽、CGアニメーションなどで多くの試み
- 21. 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)})};
- 25. 尝滨罢尝颈产のサンプルいろいろ
? 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)) };
- 26. 尝滨罢尝颈产のサンプルいろいろ
? 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);
- 27. 尝滨罢尝颈产のサンプルいろいろ
? 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;
- 28. 尝滨罢尝颈产のサンプルいろいろ
? 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]) };
- 29. 尝滨罢尝颈产のサンプルいろいろ
? 出力のフィードバック
// 出力のフィードバック
~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);
}
)
- 30. 尝滨罢尝颈产のサンプルいろいろ
? 出力のフィードバック
// ミキシング
~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) };
- 31. 尝滨罢尝颈产のサンプルいろいろ
? 引数のマッピング
~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);