Creative CodingとLisp

t-sinさんのかわりに執筆させて頂きます。すいませんが全く技術Tipsの記事じゃありません。

もともと、12/17日にShenの記事を書こうと準備をさせていただきましたが、執筆が遅れしまい。完成したころには、他の方が変わりに投稿されていたのでその記事を登録できませんでした。そのところをツイートしたらt-sinさんが開けて頂けたので、代わりに投稿します。ただし、12/17日に投稿予定だった記事ではなく今回は、技術Tipsよりも、個人的にやっていることのエッセイをかかせていただこうかと。

最近、LispでCreative Codingおよび教育関係でいろいろやっていて、そこで調査したりしているのでそのところの途中の報告だと思っていただけたらと思います。

Creative Codingとは?

そもそもCreative Codingとはなんでしょうか?これはメディア アートという文脈の中で生まれたもので、簡単に言えば、プログラミングで創造的な活動(主に映像やインタラクション、インスタレーション、音楽のようなもの)をしようというものです。

基本的には音や視覚的な表現がやりやすいようなプログラミングの環境が求められており、主にProcessingやOpenframeworks、Cinder, vvvv, Pure Dataなど、様々な環境が作られています。Lispで言えば、OvertoneやQuilなどがあります。

Creative Codingにおいてプログラミングはプログラマーだけのものではなくなりつつあるように思えます。映像をする人、インスタレーションを作る人、音楽をつくる人がプログラミングをしているのです。それは、一般的なプログラマーがやっているような問題解決型のプログラミングではなくて、まさに表現のためのプログラミングであります。

私はこのようなCreative Codingの環境やゲーム制作、プログラミング作曲ばかりしていた人間なのでずっとプログラミングが「問題解決」という意見に全く賛同できないし、より思考を表現するものとしてずっと楽しんでいた人間です。

そして同時にLisperでもあります。Lispでクリエイティブコーディングについて書いていこうかなと。

Creative CodingとLisp

私はLispはクリエイティブコーディングに向いていると思うし向いていないようにも思えます。どっちなんだと思われそうですが、つまり、いい点と悪い点があるということで、そのあたりを書いていこうと思っています。また最後に私のクリエイティブコーディングにおけるLispの実践などを話していこうかなと。

Creative CodingにLispが向いている理由

まず一つクリエイティブコーディング向いているという点はLispは書きやすいということです。それはずっとずっと昔のはてなブログに書いたことで、今はちょっと考えが変わったりしていますが。

http://nobkz.hatenadiary.jp/entry/2013/09/05/120737

いま思えばすんごく恥ずかしいブログかいたなぁと。若気の至り。

と同時に関連として載せておきます。

http://practical-scheme.net/wiliki/wiliki.cgi?Lisp%3aS%E5%BC%8F%E3%81%AE%E7%90%86%E7%94%B1

さて私がLisp自体が好きなのもあるし慣れているからかもしれないのですが、他のLisp系ではない言語を書いていると、表現のスピードが落ちます。ただ僕なりに考えを言わせてもらうと、他のその他の言語は、自然言語に近づけようとした結果、複雑になり、構文のルールが多くなってしまってそれが、思考のノイズになっているように思えます。(これはLisperだから思うことかもしれません。Lispを知らなければその”ノイズ”に気づくことがないのかもしれない)。LispはコードがS式であるから、字句的な文法においては迷いがなく書けると言い換えてもいいかもしれません。ただし、Lispの文法がシンプルである、とは私はそれほど思っていません。letの構文なんかは毎回複雑だなーとか思ったりしています。

別の利点を述べておきましょう。LispにはREPLがありそこで対話的にプログラミングできるということはクリエイティブコーディングの文脈においてもとても重要だと思っています。またS式の一部を部分的に評価したり、ホットコードローディングしたり、クリエイティブコーディングにおいてとても有利に働く点のように思えます。それは、ライブコーディングをしながらプログラミングで音楽を演奏したりするのにとても最適でした。

他にも、文法的にも関数型言語であり、手続きや関数を渡したりできるのであり、それは例えばとあるグラフィックスを表示するプログラムを関数を複数用意して、そのメインループの中や、なにかの入力で、表示する関数を入れ替えたり、関数を合成して新しいグラフィックスを生成したりとほんとに様々な面でクリエイティブコーディングに有利に働くものがあるように思えます。ここで一つ例をあげると例えば、Processingで配列が渡されて、それを使ってrectを描画するとなると

for(int i=0; i < array.length; i++){
    rect(a[i].x, a[i].y, 10, 10);
}

などとforを使ってループをかくと思いますがLispだと

(mapcar 
    (lambda (a) (rect (get-x a) (get-y a) 10 10))
    array)

forを使うか、mapcarを使うかって違いですが、forの場合はどうしても、配列の中の1番目から順番に最後までループするという印象で、mapcarの場合は、リストの要素を与えられた関数に適用するという違いで、思考の方法に差があります。それは、表現するときにいちいち、mapcarのようなものを、forのような変換するコストがあるように思えます。また、もう一つの違いとして、mapcar全体も式であり、もしかしたら、グラフィックオブジェクトを返してそれらを扱える可能性が残っているということです。一方では、for文ではそのような発想が出てきません。それは大きく違いを生むように思えまs。

一方で向かない理由があります。

Creative CodingにLispが向かない理由

Creative Codingにおいて個人的に大切なことがあります。それは入門のしやすさであり、環境構築のしやすさです。

Processingがなぜよく使われいるかというのはその環境構築のしやすさにあると思います。Processingを始めるにはまずProcessingの公式からProcessingをダウンロードして、ダウンロードしたProcessingをダブルクリックして起動するだけでいい。それで始められる。そこにはCLIを開いて、パスを通したり、プログラミング言語のインストールしたり、ライブラリをダウンロードしたり、エディタの準備をしたりする必要はなくて、そこにただ、エディタ、コンパイラ、ランタイムも全部はいっている。またProcessingはMacOSでもWindowsでも動く。iOSのアプリもある。

一方でLispはどうだろう。Lispを入門するなら、まず、Lispの方言を選ばなければならない。そして、処理系の選択をする。エディタの設定もする。クリエイティブコーディングの実践のために必要なライブラリを探し出す。最悪、C言語の関数を呼び出してなんとかしたり、すごく入門には難しい。

もちろん、一部のLisp系のプログラミングツールの中には、ただダウンロードして起動するだけってのはある。けれども、一部のOSでしか動かなかったり、古すぎてそもそも動かなかったりする。

ただし、音響系、音楽系の環境はとてもLispは強いように思えます。とても環境がよくないのはあくまで、グラフィックスに関係するところのように思います。

LispのCreative Codingの実践

いろいろやってきましたが、音響系でやる分にはLispは素晴らしいものだったように思えます。しかしながら、グラフィックスを利用しようとすると途端に問題がおこります。今回はLispでグラフィックスに関するCreative Codingをどのように実践してきたかを話していきたいと思います。

私はLisp方言の中ではCommon LispとShenとSchemeをよく使います。Clojureは時々触る程度です。Common Lispについてはなしましょう。

Common LispでCreative Codingといえば、いくつか選択肢があります。まず最初に私が選択したのはsketchです。これはProcessingからインスパイアされたCommon Lispのグラフィックフレームワークです。

https://github.com/vydd/sketch

2Dで表現する分には大変良いと思います。しかしながら3Dの描画がないので残念だなと思いました。

別の方法としては、Common Lispで、OpenGLを使う方法です。cl-glfwとcl-openglを使う方法です。これは別途後日記事にしようと考えています。

もう一つの方法としては、CFFIを使い、直接グラフィックAPIを呼び出す方法です。これも非常に有効でした。これも同じく記事にしていきたいと思います。(非常に長くなるので...)

最後にコードをそのままジェネレートする方法です。グラフィックスではないのですが、Arduinoを動かすとき、Arduino言語で動かすのですが、これがまぁ、セミコロン忘れたり、いろいろ面倒だったので、LispコードからArduinoにジェネレートするコードを書きました。

(defloop 
    (if (d-high? pin7) (d-write pin8 low))

これはArduinoで

void setup(){
    pinMode(pin7, INPUT);
    pinMode(pin8, OUTPUT);
}

void loop(){
    if( digitalRead(pin7) == HIGH){
        digitalWrite(pin8, HIGH);
    }
}    

と変換するコードも書いたりしていました。これもnote記事に書いていきたい....

あとはCommon LispからJSを吐き出してjsで表現するというのもあります。これは現在実験中です。正直これが終わり次第どのようにクリエイティブコーディングをLispでやっていくかみたいなのを書いていきたいと思っています。

creative codingに関して良いフレームワークやライブラリがあればいいのですが、個人的には存在しないように思えます。なのでそれを現在作っています。

LispでのCreative Coding環境を作っている

最後にこの話をして終わりたいと思っています。現在私はLispでのCreative Coding環境を開発しています。それはいまのところ目指しているところとしては

1. 構築が容易であること。
2. 学習が容易であること(小学生も理解可能なぐらい)
3. グラフィックスや音響が充実していること
4. 拡張性があること
5. 汎用的であること

を目的に設計しています。それは私の理想のプログラミング環境を追求していることであり、今後なにか情報を出したり公開したりリリースする予定です。

もともとこれは2017年あたりからつくってた環境でした。まだ公開はしていませんが、正直近々公開できればと思っています。2017年当時に動かした動画を乗せておきます。つぶやいてましたね。


動画ではファイル全体の変更を検知して自動ロードしていますが、オードロードを部分的にできたりという機能を追加したりしています。

最後にもともと12/17日書いた、Shenの記事は公開する予定はありませんが、別に編集して適当な時に出そうかと思います。それにしても軽く書くつもりが、長くなってしまった。

この記事が気に入ったらサポートをしてみませんか?