yoppa.org


Blog

Shadertoneで遊んでみた – 導入編

overtone-logo

Shadertoneで遊んでみたら、なかなか面白かったので、備忘録としてブログに書いてみる。

Shadertoneは、ソースコードがGithubで公開されている。

このリポジトリの要約をみると “A mix of www.shadertoy.com and Overtone” とある。理解してみるとなかなか的を得た要約なのだけれど、最初は何のことやらという感じだったのでここから解読してみる。

まず、shadertoyの方だけれど、こちらはGLSL(Shader)をWebブラウザ上で実行とコーディングする環境。GLSL sandbox に近い感じ。まあ、こちらは理解できる。

問題は、Overtoneのほうで、こちらはオフィシャルのWebサイトが用意されている。

ここの説明の、「SuperColliderとClojureをくっつけたもの」という部分が要点となる。SuperColliderは、コンピュータ音楽言語でありオーディオ生成エンジンとして、すっかりお馴染なので割愛。Clojureとは、Lispの方言の一つで、いま話題の「関数型プログラミング言語」のひとつ。Javaのバーチャルマシンの上で動作する。

つまり、ここまでを要約すると、

  • Shadertoneは、OvertoneとGLSLのライブコーディング環境をミックスしたもの
  • Overtoneは、ClojureからSuperColliderの音響合成を行うライブコーディング環境

ということ。

別の言語体系で、SuperColliderの音響合成エンジンで音を生成するというアプローチは、Sonic Piに似ている。それもそのはずで、OvertoneおよびShadertoneの作者Sam Aaronは、Sonic Piの開発者でもある。Sonic Piと同様、Overtoneもライブコーディングの機能を重視している。さらに、複数人でソースを共有しながらのライブコーディングも可能となる模様。Overtoneの実行している様子は、本人によるデモがわかりやすい。

Sonic Piが、どちらかというと簡易な文法でライブコーディングを体験できる教育用途に主眼を置いているのに対して、Overtoneはより本格的にゴリゴリとライブコーディングする環境という印象。さらにOvertone/Shadertoneは、インストールと環境構築がややハードルが高いのがちょっとやっかいな感じ。手元のOS X 10.3.3で動かした際の環境構築をざっと書き出してみる。

まず、Clojureを対話的に実行可能なテキストエディタを用意する必要がある。イケてるライブコーディング用エディタとして話題のLight Tableや、vimからでも実行可能なのだが、ここでは作者であるSam Aaronが使用しているEmacsで環境構築してみる。

まず、OS Xにいろいろインストールするのに便利なHomebrewの環境を用意する。Homebrewの導入はこちらを参照。

Homebrewの環境が整ったら、emacsを最新版(2015年4月現在だと、24.5)にしておく。

次に、Clojureのプロジェクト生成を自動化してくれるLeiningenという環境を入れる。これもHomebrewをつかうと楽。

次に、Emacsをライブコーディング用にチューンナップする。Sam Aaron自ら、自分の環境をパッケージングしてEmacs-Liveという名前で公開している。こちらもターミナルから1行コマンドでインストール可能。

次に、GithubからShadertoneをZipでダウンロード、もしくはCloneする。

Shadertoneをダウンロードしたフォルダに移動して、emacsを起動

すると、Emacs-liveでバキバキにチューンナップされたEmacsが起動する。

screenshot_902

まずは、Shadertoneのサンプルを試してみる。emacsから、example/00demo_intro_tour.clj を開いてみる。

screenshot_903

サンプルを開いた状態で、emacsで以下のコマンドを実行

これで、Shadertoneを対話的に実行する環境が起動する(起動にはしばらく時間がかかるので注意)。

このあとは、それぞれの行の末尾に移動して、

を入力するとその行が評価される。例えば、

の末尾に移動して C-c C-e をすると、ウィンドウが起動してShaderが表示される。ここから先は下記の映像を参照してみてほしい。

こんな感じで、どんどんライブコーディングしながら音と映像を同期していける。なかなか素晴らしい。

だいぶ長くなってきたので、続きはまた今度。