Your SlideShare is downloading. ×
  • Like
Interactive Music II SuperCollider応用 JITLib - ライブコーディング 2
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

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

  • 841 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
841
On SlideShare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
23
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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