life tips & 雑記 禅の歴史と思想 旅と歴史 アートとスポーツ Clojure Java 本ブログのナビ
ジェネレーティブアートとプログラムとアルゴリズム
Clojureのカンファレンスの一つであるClojure/Conj2018にて
ジェネレーティブアートとはwikiによると
「コンピュータソフトウェアのアルゴリズムや数学的/機械的/無作為的自律過程によってアルゴリズム的に生成・合成・構築される芸術作品を指す。コンピュータの計算の自由度と計算速度を活かし、自然科学で得られた理論を実行することで、人工と自然の中間のような、統一感を持った有機的な表現を行わせる作品が多い。
ジェネレーティブアートは、創作方法として自然科学的なシステムを主体として用いた芸術である。前提として、自律的に動作する機構を設計して作品制作を行わなければならない点が、他の芸術分野との違いであると言える。システムによる作品は、複雑系や情報理論といった科学理論を実行することがある。
制作者には高度に数学的なイメージ能力と、複雑なアルゴリズムの考案・実装技術が要求されるため、参入の敷居は高い。数式やアルゴリズムの扱いに長けた理系分野在籍者が、この分野の作品に触れた事が切っ掛けで強い魅力を感じて参入する分野でもある。
2000年代のProcessingの登場まで、創作内容の本質のみに集中できるようなプログラミング環境が整備されていなかったことが原因で、未だに一般的な創作手法とは言い難い状況にある。2010年代の各種広告媒体(Webサイトやデジタルサイネージ等)やイベントにおけるメディアアートの隆盛や、芸術系の学校教育におけるProcessingやopenFrameworksの普及も相まって、これからの発展が期待される分野である」
とある。
日本でのコンピュータによるアートだとチームラボによるものが有名だが、チームラボのものはあくまでもアートの表現にコンピューターを使っているだけで一部アルゴリズムを多用しているものの、”数学的/機械的/無作為的自律過程によってアルゴリズム的に生成・合成・構築される芸術作品”を志向しているではない。
これに対してジェネレーティブアートは、例えば”一度見たら病みつきになるジェネレーティブアート“等でも紹介されているようにもう少し無機質なものとなる。
これは自然にあるものや人工的に作られた”システム”の美しさを表現したものと言え、以前”アートとプログラミングに共通する美について“でも述べたような、アルゴリズムやプログラムの美しさを表現したものとも言える。本ブログの中でも”機械学習のための連続最適化“等で述べられている最適化の為の数学的アルゴリズムや”データの幾何学的アプローチ“に述べられている機械学習の幾何学的なアプローチの美しさも、適切な表現を用いることで鑑賞に耐えうるものになると考えることができる。
そのようなことから、
また、ジェネレーティブアートではプログラムが出力するものすべてがプロダクトとなることから、単純な画像の出力だけではなく、プログラムで制御した機械(ロボット等)によるものも範疇に加わるものとなる。例えばken rilandoは、Autopoiesisと称したロボットを使ったジェネレーティブアートを発表している。
ジェネレーティブアート(以降GArtと略称)はコンピューターの生まれたときから存在しており、歴史的には1960年代から始まっている。初期のGArtは、コンピューターパワーも小さくできることが限られていた。また、ほとんどのGArtは「キュレーション」のステップを持ち、アーティストが好きなだけ多くの出力を生成し、その中からお気に入りのセットに絞り込み、キュレーションされた出力のみが一般に公開されるという形をとった。これは”AI研究者と俳人 人はなぜ俳句をつくるのか“で述べたAI俳句の作成のステップにも見られるものとなる。
これに対して、ArtBlocks等で用いられているブロックチェーン技術等のICT技術の発展により、アーティストはジェネレーティブスクリプトを作成し、それをイーサリアム等のブロックチェーン上に乗せ、アーティストは、スクリプトによって鋳造される反復の数を指定し、コレクターが反復を鋳造する場合(つまり、購入)、スクリプトを実行して新しい出力を生成し、その出力はNFTにラップされ、コレクターに直接転送されるという新しい形態が生まれている。
このプラットフォームでは、従来100生成して5だけ取れれば良いアルゴリズムから、常に「品質の良い」アウトプットを出力する洗練されたアルゴリズムを作ることがアーティストに要求されるようになってきているとのこと。
ProcessingはJavaで書かれたコードではあるが、現在ではpyhtonでも動作可能なツールとなる。Processingを利用するには、公式ダウンロードページよりそれぞれのOSにあったソースをダウンロードする。
ダウンロードしたファイルをクリックすると使えるようになる。
まず公式ページのHello Worldから、以下のコードを入力し、左上の矢印をクリックする。
line(15, 25, 70, 90);
するとJavaが起動し以下のような図形が表示される。
さらに以下のようなコードを入力すると
void setup() {
size(400, 400);
stroke(255);
background(192, 64, 0);
}
void draw() {
line(150, 25, mouseX, mouseY);
}
以下に示すようなマウスを使った動的な描画を行うことができる。
上記のコード例でも分かる通り、コードはJavaで記述することとなる。これをpythonで入力するにはpyhtonモードにする必要がある。そのためにはトップメニューの「スケッチ」→「ライブラリをインポート」→「Manage Library」でライブラリインポート画面に入り、「Python mode for processing 4」を選択して「install」を押すことでpythonモードをインストールすることができる。(インストール直後pythonモードのライブラリが見えない場合は、まず「PixeFlow」をインストールすることで見えるようになる)
上記のHello Worldをpyhtonのコードで書くと以下のようになる。
;;lineを描くコード
line(15, 25, 70, 90)
;;マウスを制御するコード
def setup():
size(400, 400)
stroke(255)
background(192, 64, 0)
def draw():
line(150, 25, mouseX, mouseY)
pyhtonの方がシンプルなコードになることがわかる。
最後にquilのJavascript版であるclojurescriptでのコードの動作について述べる。
まずclojurescriptのquilテンプレートを”lein new quil-cljs hello-quil”で作成する。
作成されたコードは以下のようになる。
(ns hello-quil.core
(:require [quil.core :as q :include-macros true]
[quil.middleware :as m]))
(defn setup []
; Set frame rate to 30 frames per second.
(q/frame-rate 30)
; Set color mode to HSB (HSV) instead of default RGB.
(q/color-mode :hsb)
; setup function returns initial state. It contains
; circle color and position.
{:color 0
:angle 0})
(defn update-state [state]
; Update sketch state by changing circle color and position.
{:color (mod (+ (:color state) 0.7) 255)
:angle (+ (:angle state) 0.1)})
(defn draw-state [state]
; Clear the sketch by filling it with light-grey color.
(q/background 240)
; Set circle color.
(q/fill (:color state) 255 255)
; Calculate x and y coordinates of the circle.
(let [angle (:angle state)
x (* 150 (q/cos angle))
y (* 150 (q/sin angle))]
; Move origin point to the center of the sketch.
(q/with-translation [(/ (q/width) 2)
(/ (q/height) 2)]
; Draw the circle.
(q/ellipse x y 100 100))))
; this function is called in index.html
(defn ^:export run-sketch []
(q/defsketch hello-quil
:host "hello-quil"
:size [500 500]
; setup function called only once, during sketch initialization.
:setup setup
; update-state is called on each iteration before draw-state.
:update update-state
:draw draw-state
; This sketch uses functional-mode middleware.
; Check quil wiki for more info about middlewares and particularly
; fun-mode.
:middleware [m/fun-mode]))
; uncomment this line to reset the sketch:
; (run-sketch)
次にこのソースファイルを”lein compile”でjavascriptにコンパイルし、/resource/public/index.htmlファイルを任意のブラウザで開くと以下のようなサンプル画像が現れる。
clojurescriptを用いることで、webアプリケーションが容易に構築することができる。clojurescriptの詳細に関しては”ClojureとJavascript、node.js、webフレームワークとの連携“等を参照のこと。
コメント
[…] ールとして利用されており、また、抽象的な概念を扱うため、”ジェネレーティブアートとプログラムとアルゴリズム“でも述べているように、芸術の一形態とも認織されている。 […]
[…] ジェネレーティブアートとプログラムとアルゴリズム […]
[…] 創造性の刺激: AIは”混合整数最適化の概要とアルゴリズム及びpythonによる実装“や”劣モジュラ最適化の概要と適用事例および実装例“のような手法を用いることで異なるデータセットやアイデアを組み合わせて新たなアウトプットを生成する能力を持っている。これにより、AIが提示する異なるアプローチや視点が、人間の創造性を刺激する要因になる。例としては、”ジェネレーティブアートとプログラムとアルゴリズム“で述べている様なAIが音楽の作曲や絵画の生成を試みる取り組みがある。 […]
[…] 次回”ジェネレーティブアートとプログラムとアルゴリズム“では、これらのアートを自動で生成する活動について述べている。 […]