Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

  • Be the first to comment

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

  1. 1. Interactive Music II SuperCollider応用 JITLib - ライブコーディング 2 2013年11月28日 東京藝術大学芸術情報センター(AMC) 田所 淳
  2. 2. 今日の内容 ‣ JITlibを使用した、SuperColliderライブコーディングつづき ‣ より高度なライブコーディングに挑戦!
  3. 3. 先週の復習
  4. 4. ライブ・コーディング ‣ ライブ・コーディング (Live Coding) とは? ! ‣ 「on-the-fly programming」「just in time programming」 ‣ 即興的にプログラミングを行う ! ‣ コンピュータ音楽、CGアニメーションなどで多くの試み
  5. 5. ライブ・コーディング ‣ ライブコーディングに対応した言語 ! ‣ ‣ ‣ ‣ ‣ ‣ ‣ ‣ SuperCollider ChucK COLT Impromptu Pure Data Max LiveCode Fluxus
  6. 6. ライブ・コーディング ‣ 参考サイト: TOPLAP
  7. 7. ライブ・コーディング ‣ Study In Keith - A livecoding performance by Andrew Sorensen
  8. 8. SuperColliderで、ライブコーディング ‣ JITlibとは? ‣ 標準のsupercolliderサーバ・リリースとともに配布されるサー ド・パーティ・ライブラリの1つ ‣ SuperCollider (SCLang) にライブコーディング機能を追加 ‣ 参考: http://doc.sccode.org/Overviews/JITLib.html
  9. 9. SuperColliderで、ライブコーディング ‣ 一般のSuperColliderでのコード作成イメージ
  10. 10. SuperColliderで、ライブコーディング ‣ 一般のSuperColliderでのコード作成イメージ 楽器の全てを定義
  11. 11. SuperColliderで、ライブコーディング ‣ 一般のSuperColliderでのコード作成イメージ 楽器の全てを定義 最終結果のシグナルを出力へ 出力
  12. 12. SuperColliderで、ライブコーディング ‣ SuperCollider + JITLibでのコード作成イメージ
  13. 13. SuperColliderで、ライブコーディング ‣ SuperCollider + JITLibでのコード作成イメージ 出力 まず始めに 最終出力を作成
  14. 14. SuperColliderで、ライブコーディング ‣ SuperCollider + JITLibでのコード作成イメージ Node ノートを出力に送ると すぐに音が生成される 出力
  15. 15. SuperColliderで、ライブコーディング ‣ SuperCollider + JITLibでのコード作成イメージ Node Node 複数のNodeを ミックス可能 出力
  16. 16. SuperColliderで、ライブコーディング ‣ SuperCollider + JITLibでのコード作成イメージ Node Node 出力 Nodeを後から 入れ替えも可能
  17. 17. SuperColliderで、ライブコーディング ‣ SuperCollider + JITLibでのコード作成イメージ Node Node Node Node Node 出力結果を常に聞きながら 複雑な構造を構築できる 出力
  18. 18. SuperColliderで、ライブコーディング ‣ JITlibモードに入る、元に戻る //セットアップ。これによって「jitlibモード」に入る p= ProxySpace.push(s); ! //通常のsc langに戻るには p.pop; !
  19. 19. SuperColliderで、ライブコーディング ‣ NodeProxy サーバーで処理する場所を確保する //「~ + 変数名」はサーバーで処理される何かの場所を確保する(NodeProxy) //ugen関数、静的な数、pbind、lfoなどを入れることが可能 ! //例えば、UGenのひとつSinOscの出力結果をNodeProxyに入れる ~out = {SinOsc.ar}; ! //proxyspaceに定義したもののリストを見る p; ! //ProxySpaceに定義したものを再生する ~out.play;
  20. 20. 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;
  21. 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)})};
  22. 22. LITLibのサンプルいろいろ
  23. 23. LITLibのサンプルいろいろ ‣ いろいろなサンプルを通して、JITLibの雰囲気をつかんでいき ましょう ‣ 実際にコードを実行して、音を聞きながら進めていくと、理解 しやすいと思います
  24. 24. LITLibのサンプルいろいろ ‣ LITLibの準備、ProxySpaceの作成 // ProxySpaceの作成 (コードを実行する場所を確保) p = ProxySpace.push(s); ! // まず始めに出力を設定 ~out.play;
  25. 25. LITLibのサンプルいろいろ ‣ 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. 26. LITLibのサンプルいろいろ ‣ 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. 27. LITLibのサンプルいろいろ ‣ 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. 28. LITLibのサンプルいろいろ ‣ 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. 29. LITLibのサンプルいろいろ ‣ 出力のフィードバック // 出力のフィードバック ~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. 30. LITLibのサンプルいろいろ ‣ 出力のフィードバック // ミキシング ~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. 31. LITLibのサンプルいろいろ ‣ 引数のマッピング ~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);
  32. 32. LITLib実習 ‣ 前回、自分が作成した楽器を、JITLibで動かせるように編集 ‣ 音を聞きながら、パラメーターを微調整してみる ‣ ライブコーディングをすると、便利になったか?

×