Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Live Coding やってみた

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for YM053 YM053
April 23, 2025
98

Live Coding やってみた

Avatar for YM053

YM053

April 23, 2025

Transcript

  1. コーディング のインプロヴィゼーション - Live Coding はしばしば「ジャズ」に例えられる。 (演奏の計画 (chord 進行) はある程度あっても、実際の流れはその場のノリで決まる)

    - その場の雰囲気、他の演奏者、オーディエンスの反応に応じて 演奏 (コーディング)する。 失敗も魅力の一つ。 - 他者との即興セッションも可能。 - コードは変化し続ける。"完成"はない。
  2. モチベーション - 年末の Unagi Py の懇親会で Live Coding の話が盛り上がったため。 -

    別件で、昨年あたりから少し Three.js を触っていて、 Live Coding で使えそうだなと思ったため。
  3. 今日はコイツ ついてご紹介。 今回、  音楽演奏: FoxDot (Python) 映像演出: React Three Fiber

    (Typescript) をトライしてみた。 今日は FoxDot ついては省略。 (また別の機会 (Unagi.Py) などで。)
  4. FoxDot (LiveCoding (演奏)) SuperCollider (音源 (Synth)) システム構成 Web Browser (Three

    React Fiber) (映像演出) OSC (Open Sound Control) WebMIDI MIDI pythonのプログラムに応じて メッセージ送信 音声に応じて メッセージ送信
  5. const Box = (props: ThreeElements['mesh']) => { const meshRef =

    useRef<THREE.Mesh>(null!) const [hovered, setHover] = useState(false) const [active, setActive] = useState(false) useFrame((state, delta) => { return (meshRef.current.rotation.x += delta) }) return ( <mesh {...props} ref={meshRef} scale={active ? 3 : 1.5} onClick={(event) => setActive(!active)} onPointerOver={(event) => setHover(true)} onPointerOut={(event) => setHover(false)}> <boxGeometry args={[1, 1, 1]} /> <meshStandardMaterial color={hovered ? 'hotpink' : '#2f74c0'} /> </mesh> ) }
  6. シェーダー組み込み - React Three Fiber (Three.js) では、 カスタムの shader (GLSL)

    を組み込むことが可能。 - Javascript だけでは難しいアニメーション制御可能。 - GPU 上で演算が可能。 (大量の particle を使った effect などが実現できる。)
  7. 組み込み方法 - (Three.js で用意されている 既存の material に) default で 組み込まれている

    shader の一部を書き換えて使用する。 - 完全にカスタムな shader を作成することも可能。 * 初回 render の時に WebGL -> GPU driver に渡って、 compile (GPU driver) -> GPU に転送 されているっぽい? (Three.js manual を見た感じ。)
  8. const RippleMaterial = shaderMaterial ( { uTime: 0, uOpacity: 0,

    }, // Vertex Shader ` varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); } `, // Fragment Shader ` varying vec2 vUv; uniform float uTime; uniform float uOpacity; void main() { vec2 center = vec2(0.5, 0.5); float dist = distance(vUv, center); float rippleRadius = mod(uTime * 0.4, 1.0); float thickness = 0.02; float ripple = smoothstep(thickness, 0.0, abs(dist - rippleRadius)); float fade = smoothstep(0.7, 0.0, dist); vec3 innerColor = vec3(0.2, 0.4, 1.0); vec3 midColor = vec3(0.6, 0.3, 0.9); vec3 outerColor = vec3(1.0);