Monorepo for Aesthetic.Computer
aesthetic.computer
1% !TEX program = xelatex
2\documentclass[10pt,letterpaper,twocolumn]{article}
3
4\usepackage[top=0.75in, bottom=0.75in, left=0.75in, right=0.75in]{geometry}
5\usepackage{fontspec}
6\usepackage{unicode-math}
7\setmainfont{Latin Modern Roman}
8\setsansfont{Latin Modern Sans}
9\newfontfamily\acbold{ywft-processing-bold}[Path=../../system/public/type/webfonts/,Extension=.ttf]
10\newfontfamily\aclight{ywft-processing-light}[Path=../../system/public/type/webfonts/,Extension=.ttf]
11\newfontfamily\kidlispfont{ComicRelief-Regular}[
12 Path=../arxiv-kidlisp/fonts/,
13 Extension=.ttf
14]
15\newfontfamily\kidlispbold{ComicRelief-Bold}[
16 Path=../arxiv-kidlisp/fonts/,
17 Extension=.ttf
18]
19\setmonofont{Latin Modern Mono}[Scale=0.85]
20
21\usepackage{xeCJK}
22\setCJKmainfont{Droid Sans Japanese}
23\setCJKsansfont{Droid Sans Japanese}
24\setCJKmonofont{Droid Sans Japanese}
25
26\usepackage{xcolor}
27\usepackage{titlesec}
28\usepackage{enumitem}
29\usepackage{booktabs}
30\usepackage{tabularx}
31\usepackage{multicol}
32\usepackage{fancyhdr}
33\usepackage{hyperref}
34\usepackage{graphicx}
35\graphicspath{{figures/}{../../papers/arxiv-ac/figures/}}
36\usepackage{ragged2e}
37\usepackage{microtype}
38\usepackage{listings}
39\usepackage{natbib}
40\usepackage[colorspec=0.92]{draftwatermark}
41
42% === COLORS ===
43\definecolor{acpink}{RGB}{180,72,135}
44\definecolor{acpurple}{RGB}{120,80,180}
45\definecolor{acdark}{RGB}{64,56,74}
46\definecolor{acgray}{RGB}{119,119,119}
47\definecolor{klbrand}{RGB}{205,92,155} % kidlisp.com primary (--ac-purple)
48\definecolor{klcyan}{RGB}{112,214,255} % kidlisp.com ".com" cyan (#70D6FF)
49\definecolor{kldark}{RGB}{48,43,58} % kidlisp.com dark purple
50\definecolor{draftcolor}{RGB}{205,92,155}
51
52% KidLisp syntax colors
53\definecolor{klparen}{RGB}{140,140,160}
54\definecolor{klkw}{RGB}{119,51,170}
55\definecolor{klfn}{RGB}{0,136,170}
56\definecolor{klcolor}{RGB}{204,80,0}
57\definecolor{klnum}{RGB}{204,0,102}
58\definecolor{klstr}{RGB}{44,145,44}
59\definecolor{klcmt}{RGB}{140,140,140}
60\definecolor{klvar}{RGB}{50,50,50}
61\definecolor{klspecial}{RGB}{180,72,135}
62\definecolor{klbg}{RGB}{250,248,252}
63
64\DraftwatermarkOptions{text=WORKING DRAFT,fontsize=3cm,color=draftcolor!18,angle=45}
65
66\hypersetup{colorlinks=true,linkcolor=acpurple,urlcolor=acpurple,citecolor=acpurple,
67 pdftitle={KidLisp 言語リファレンス:12カテゴリ118個の組み込み関数}}
68
69\titleformat{\section}{\normalfont\bfseries\normalsize\uppercase}{\thesection.}{0.5em}{}
70\titlespacing{\section}{0pt}{1.2em}{0.3em}
71\titleformat{\subsection}{\normalfont\bfseries\small}{\thesubsection}{0.5em}{}
72\titlespacing{\subsection}{0pt}{0.8em}{0.2em}
73
74\pagestyle{fancy}\fancyhf{}
75\renewcommand{\headrulewidth}{0pt}
76\fancyhead[C]{\footnotesize\color{acpink}\textit{作業草稿 --- 引用不可}}
77\fancyfoot[C]{\footnotesize\thepage}
78
79\newcommand{\ac}{\textsc{Aesthetic.Computer}}
80\newcommand{\kl}{\textsc{KidLisp}}
81
82% === KIDLISP LISTING STYLE ===
83\lstdefinelanguage{kidlisp}{
84 morekeywords=[1]{def,if,repeat,once,later,die,let,do,fn},
85 morekeywords=[2]{wipe,ink,line,box,circle,tri,plot,flood,shape,write,type,paste,print},
86 morekeywords=[3]{scroll,zoom,spin,blur,contrast,suck,pan,sort,resetSpin,smoothspin,unpan,fill,outline,stroke,nofill,nostroke},
87 morekeywords=[4]{random,wiggle,sin,cos,tan,floor,ceil,round,abs,sqrt,min,max,mod},
88 morekeywords=[5]{width,height,frame,time,resolution,fps,screen,pen,hand,gamepad,mic,amplitude},
89 morekeywords=[6]{cube,form,trans,move,scale,hop,delay,jump,melody,overtone,speaker,sound},
90 morekeywords=[7]{embed,layer,fade,bake,list,get,set,tap},
91 sensitive=true,
92 morecomment=[l]{;},
93 morestring=[b]",
94 literate=
95 {(}{{{\color{klparen}(}}}1
96 {)}{{{\color{klparen})}}}1
97 {\$}{{{\color{klspecial}\$}}}1,
98}
99
100\lstdefinestyle{kidlispstyle}{
101 language=kidlisp,
102 basicstyle=\ttfamily\small,
103 keywordstyle=[1]\color{klkw}\bfseries,
104 keywordstyle=[2]\color{klfn}\bfseries,
105 keywordstyle=[3]\color{acpurple},
106 keywordstyle=[4]\color{klnum},
107 keywordstyle=[5]\color{klspecial},
108 keywordstyle=[6]\color{klfn},
109 keywordstyle=[7]\color{acpink},
110 commentstyle=\color{klcmt}\itshape,
111 stringstyle=\color{klstr},
112 numberstyle=\tiny\color{klcmt},
113 breaklines=true,
114 frame=single,
115 rulecolor=\color{acgray!30},
116 backgroundcolor=\color{klbg},
117 xleftmargin=0.5em,
118 xrightmargin=0.5em,
119 aboveskip=0.5em,
120 belowskip=0.5em,
121 showstringspaces=false,
122}
123
124\lstset{style=kidlispstyle}
125
126\setlist[itemize]{nosep, leftmargin=1.2em, itemsep=0.1em}
127\setlength{\columnsep}{1.8em}
128\setlength{\parindent}{1em}
129\setlength{\parskip}{0.3em}
130
131% Hyphenation for narrow two-column layout
132\tolerance=800
133\emergencystretch=1em
134\hyphenpenalty=50
135
136\begin{document}
137
138\twocolumn[{%
139\begin{center}
140\includegraphics[height=4em]{pals}\par\vspace{0.5em}
141{\kidlispbold\fontsize{26pt}{30pt}\selectfont\color{kldark} Kid{\color{klbrand}Lisp} 言語リファレンス}\par
142\vspace{0.2em}
143{\kidlispfont\fontsize{11pt}{13pt}\selectfont\color{klbrand} 12カテゴリ118個のジェネラティブアート組み込み関数}\par
144\vspace{0.3em}
145{\kidlispfont\fontsize{9pt}{11pt}\selectfont\color{acgray} 構文、意味論、タイミング、色彩、\texttt{\$}-Code合成システム}\par
146\vspace{0.6em}
147{\normalsize @jeffrey}\par
148{\small\color{acgray} Aesthetic.Computer}\par
149{\small\color{acgray} ORCID: \href{https://orcid.org/0009-0007-4460-4913}{0009-0007-4460-4913}}\par
150\vspace{0.3em}
151{\small\color{acpurple} \url{https://aesthetic.computer}}\par
152\vspace{0.6em}
153\rule{\textwidth}{1.5pt}
154\vspace{0.5em}
155\end{center}
156
157\begin{center}
158{\small\color{acpink}\textbf{[ 作業草稿 --- 引用不可 ]}}
159\end{center}
160\vspace{0.3em}
161
162\begin{quote}
163\small\noindent\textbf{要旨。}
164\kl{} はジェネラティブアートのための極小Lisp方言であり、12カテゴリにわたる118個の組み込み関数を持ち、ユーザー定義関数なし、再帰なし、ファイルI/Oなし、ネットワークアクセスなしという設計である。設計上安全であり、\kl{} プログラムはサンドボックスを突破できず、ホストをクラッシュさせることもできず、キャンバス以外のリソースにアクセスすることもできない。本稿は完全な言語リファレンスとして、構文ハイライト付きの例で各組み込み関数を文書化する。タイミングシステム(コールバック不要のフレームベースおよび秒ベースのスケジューリング)、色彩モデル(名前付き色、RGB、グラデーション、パターン)、\texttt{\$}-code合成システム(主要な抽象化メカニズムとして参照によりプログラムを埋め込む)、評価モデル(確定的擬似乱数生成器を用いて毎フレームAST全体を再評価)を扱う。\kl{} は\emph{省略}を中心に設計された言語として提示する。何ができないかは何ができるかと同じく慎重に設計されており、その制約が創作空間を生み出し、59人の作者がこれまでに16,634のプログラムを書いている。
165\end{quote}
166\vspace{0.5em}
167}]
168
169\section{構文}
170
171\kl{} はS式構文を使用する~\citep{mccarthy1960recursive}。各式はアトム(数値、文字列、シンボル)またはリスト(括弧で囲まれた式)である:
172
173\begin{lstlisting}
174; Atoms
17542 ; number
176"hello" ; string
177red ; symbol (color name)
178
179; Lists (function application)
180(wipe "navy") ; clear screen navy
181(ink "red") ; set drawing color
182(box 10 10 50 50) ; draw rectangle
183(circle 64 64 30) ; draw circle
184\end{lstlisting}
185
186演算子なし、中置記法なし、括弧・文字列・数値・シンボル以外の特殊構文なし。算術は前置記法を使用する:
187
188\begin{lstlisting}
189(+ 1 2) ; => 3
190(* 3 (+ 1 2)) ; => 9
191(- 10 3) ; => 7
192(/ 100 4) ; => 25
193(% 17 5) ; => 2 (modulo)
194\end{lstlisting}
195
196\section{12のカテゴリ}
197
198\subsection{グラフィックス(9関数)}
199
200描画プリミティブは即時モードで動作する——各呼び出しがフレームバッファに直接レンダリングされる。
201
202\begin{lstlisting}
203(wipe "black") ; clear canvas
204(ink "cyan") ; set color
205(line 0 0 128 128) ; diagonal line
206(box 10 10 40 40) ; rectangle
207(circle 64 64 20) ; circle at center
208(tri 32 10 10 54 54 54) ; triangle
209(plot 64 64) ; single pixel
210(flood 64 64) ; flood fill
211(shape 10 10 50 10 30 50) ; polygon
212\end{lstlisting}
213
214\texttt{fill} と \texttt{outline} は図形を塗りつぶすか輪郭のみにするかを制御する(Processing互換):
215
216\begin{lstlisting}
217(fill) ; filled shapes
218(ink "red")
219(circle 64 64 30) ; solid red circle
220
221(outline) ; outlined shapes
222(ink "white")
223(circle 64 64 30) ; white ring
224\end{lstlisting}
225
226\subsection{変換(11関数)}
227
228ピクセルレベルの変換は描画後にフレームバッファに作用する:
229
230\begin{lstlisting}
231(scroll 1 0) ; shift pixels right
232(zoom 1.01) ; slow zoom in
233(spin 1) ; rotate 1 degree
234(blur 2) ; gaussian blur
235(contrast 1.2) ; increase contrast
236(suck 0.5) ; radial displacement
237(sort) ; sort pixels by brightness
238\end{lstlisting}
239
240変換はフレーム間で\emph{累積}し、明示的な状態管理なしにアニメーションを生み出す:
241
242\begin{lstlisting}
243(wipe "black")
244(ink "white")
245(circle 64 64 10) ; draw circle
246(spin 2) ; rotate 2 deg/frame
247(zoom 1.005) ; grow slightly/frame
248; Result: spiraling, growing circle
249\end{lstlisting}
250
251\subsection{数学(14関数)}
252
253\begin{lstlisting}
254(sin (* frame 0.05)) ; sine wave
255(cos (* frame 0.03)) ; cosine wave
256(random) ; 0-255
257(random 10) ; 0-9
258(random 5 15) ; 5-14
259(wiggle 10) ; random +/-5
260(floor 3.7) ; => 3
261(abs -5) ; => 5
262(sqrt 16) ; => 4
263(min 3 7 1) ; => 1
264(max 3 7 1) ; => 7
265\end{lstlisting}
266
267\texttt{random} はプログラムのショートコードで初期化されたシード擬似乱数生成器を使用し、すべての生成出力を\textbf{確定的}にする。同じプログラムは常に同じ視覚的結果を生成する。
268
269\subsection{色彩(19以上の名前付き色)}
270
271色は名前、RGB値、またはグラデーション文字列で指定できる:
272
273\begin{lstlisting}
274(ink "red") ; named color
275(ink 255 0 0) ; RGB
276(ink 255 0 0 128) ; RGBA (semi-transparent)
277(ink "fade:red-blue") ; horizontal gradient
278(ink (fade "cyan" "magenta" "vertical"))
279(ink "rainbow") ; repeating rainbow
280(ink "zebra") ; striped pattern
281\end{lstlisting}
282
283利用可能な色名にはすべてのCSS名前付き色が含まれる:\texttt{red}、\texttt{green}、\texttt{blue}、\texttt{yellow}、\texttt{orange}、\texttt{purple}、\texttt{pink}、\texttt{cyan}、\texttt{magenta}、\texttt{black}、\texttt{white}、\texttt{gray}、\texttt{brown}、\texttt{lime}、\texttt{navy}、\texttt{teal}、\texttt{gold}、\texttt{coral}、\texttt{salmon}、\texttt{crimson}、\texttt{lavender}、\texttt{indigo}、\texttt{violet}、\texttt{turquoise}、\texttt{tomato}など。
284
2851行目に裸の色名を置くと背景色が設定される:
286
287\begin{lstlisting}
288"navy"
289(ink "gold")
290(circle 64 64 30)
291; Navy background, gold circle
292\end{lstlisting}
293
294\subsection{システムとディスプレイ(9関数)}
295
296\begin{lstlisting}
297(def w width) ; screen width
298(def h height) ; screen height
299frame ; current frame number
300time ; seconds elapsed
301
302(resolution "half") ; half-resolution
303(resolution 64 64) ; explicit 64x64
304(fps 30) ; set frame rate
305\end{lstlisting}
306
307\subsection{制御フロー(7関数)}
308
309\begin{lstlisting}
310; Variable definition
311(def x 50)
312(def y (+ 10 (* frame 0.5)))
313
314; Conditional
315(if (> frame 60)
316 (ink "red")
317 (ink "blue"))
318
319; Loop
320(repeat 10 i
321 (circle (* i 12) 64 5))
322
323; Execute once (not every frame)
324(once (wipe "black"))
325
326; Local binding
327(let ((cx 64) (cy 64))
328 (circle cx cy 30))
329\end{lstlisting}
330
331\texttt{repeat} ループはカウンタ変数(上記の \texttt{i})を0から$n-1$まで束縛する。ネストされたrepeatは異なる変数名を使用する:
332
333\begin{lstlisting}
334(repeat 8 i
335 (repeat 8 j
336 (box (* i 16) (* j 16) 14 14)))
337; 8x8 grid of squares
338\end{lstlisting}
339
340\subsection{タイミング}
341
342\kl{} のタイミングシステムはコールバックではなく\emph{インラインスケジューリング}を使用する。タイミング式はコードブロックをラップする:
343
344\begin{lstlisting}
345; Frame-based timing
346(0 (wipe "black")) ; every frame
347(1 (spin 5)) ; every 2nd frame
348(30f (ink "red")) ; after 30 frames
349
350; Second-based timing
351(1s (wipe "red")) ; after 1 second
352(2.5s (ink "gold")) ; after 2.5 seconds
353(1s! (write "!" 10 10)) ; fire once at 1s
354
355; Repeating intervals
356(0.5s... (spin 45)) ; every 0.5 seconds
357(1s... (scroll 1 0)) ; every second
358\end{lstlisting}
359
360これにより \texttt{setTimeout}、\texttt{setInterval}、アニメーションフレームコールバックの必要性が排除される。時間は式の\emph{属性}であり、呼び出される関数ではない。
361
362\subsection{テキスト(4関数)}
363
364\begin{lstlisting}
365(write "hello" 10 20) ; text at position
366(write "centered" ; centered text
367 (/ width 2) (/ height 2))
368(type "typed" 10 10) ; typewriter effect
369\end{lstlisting}
370
371\subsection{入力(3関数)}
372
373\begin{lstlisting}
374; Pen/mouse position and state
375(if pen
376 (circle pen.x pen.y 5))
377
378; Touch input
379(if hand
380 (line hand.x hand.y 64 64))
381\end{lstlisting}
382
383\subsection{オーディオ(6関数)}
384
385\begin{lstlisting}
386; Microphone input
387(def vol (mic)) ; amplitude 0-255
388(circle 64 64 vol) ; sound-reactive
389
390; Melody playback
391(melody "C4 E4 G4 C5")
392
393; Overtone harmonics
394(overtone 440 3) ; 3rd harmonic of A4
395\end{lstlisting}
396
397\subsection{3Dグラフィックス(8関数)}
398
399\begin{lstlisting}
400(cube "mycube") ; create 3D cube
401(form "mycube"
402 (move 0 0 -5) ; position
403 (scale 2) ; size
404 (spin (* frame 0.5) 1 1 0)) ; rotate
405\end{lstlisting}
406
407\subsection{\texttt{\$}-Codeによる合成}
408
409\kl{} 最大の特徴はその合成システムである。プログラムはユーザー定義関数を使用せず、ショートコードで他のプログラムを参照する:
410
411\begin{lstlisting}
412; Embed another program as a layer
413($cow) ; execute program "cow"
414($nece 10 20) ; pass parameters
415
416; Multi-layer composition
417(wipe "black")
418($cow) ; background layer
419($faim) ; foreground layer
420
421; Chain multiple programs
422(resolution 64 64)
423($zobi)
424(spin 1)
425($grel)
426\end{lstlisting}
427
428プログラムはMongoDBから取得され、RAMとIndexedDBにキャッシュされ、SHA-256でコンテンツアドレッシングされる。\texttt{\$}-codeシステムはユーザー定義関数、モジュール、ライブラリを単一のソーシャルメカニズムに置き換える:\emph{誰かが作ったプログラムを見つけ、コードで参照し、合成する}。
429
430最も多く参照されるプログラムは単純な視覚プリミティブであり、構成要素として機能する。このシステムはソーシャル依存グラフを生成する。プログラムAがプログラムBを埋め込み、プログラムBがプログラムCを埋め込む——観察された使用では最大7層の深さに達する。
431
432\section{評価モデル}
433
434\kl{} は\textbf{毎フレームAST全体を再評価する}。明示的に定義された変数以外に保持される状態はない。\texttt{frame} と \texttt{time} 変数は自動的にインクリメントされる。\texttt{zoom}、\texttt{scroll}、\texttt{spin} などの変換はフレームバッファに累積される。
435
436このモデルはProcessing~\citep{reas2007processing}でよく見られる \texttt{setup()}/\texttt{draw()} の分離を排除する。\kl{} プログラムの各行は毎フレーム実行される。アニメーションはフレーム依存式から生まれる:
437
438\begin{lstlisting}
439(wipe "black")
440(ink "white")
441; Circle orbits center using sin/cos
442(circle
443 (+ 64 (* 30 (cos (* frame 0.03))))
444 (+ 64 (* 30 (sin (* frame 0.03))))
445 8)
446\end{lstlisting}
447
448\subsection{確定的ランダム性}
449
450\texttt{random} のシードはプログラムのショートコードに由来する。同じプログラムは、どのデバイスでも、毎回同じ出力を生成する。これにより \kl{} プログラムは\emph{再現可能なジェネラティブアート}となる。コードが作品\emph{そのもの}であり、それを生成するための命令にとどまらない。
451
452\subsection{カオスモード}
453
454無効な入力——意味不明な文字列、不一致の括弧、ランダムな文字——はエラーメッセージを生成しない。代わりに \kl{} は低認識率(既知語彙の$<30\%$)と高特殊文字率($>50\%$)を検出し、芸術的な視覚出力をレンダリングする。ユーザーは決して「SyntaxError」を見ることがない。色彩が表示される。
455
456\section{省略による設計}
457
458\kl{} が意図的に持たないもの:
459
460\begin{itemize}
461 \item \textbf{ユーザー定義関数}:\texttt{\$}-code合成で代替
462 \item \textbf{再帰}:無限ループとスタックオーバーフローを防止
463 \item \textbf{ファイルI/O}:キャンバスが唯一の出力
464 \item \textbf{ネットワーク}:プログラムは外部データを取得できない
465 \item \textbf{文字列操作}:\texttt{concat}、\texttt{split}、\texttt{replace}なし
466 \item \textbf{エラーメッセージ}:カオスモードで代替
467 \item \textbf{Import/require}:\texttt{\$}-codeで代替
468 \item \textbf{オブジェクト/クラス}:データは数値、文字列、リストのみ
469\end{itemize}
470
471各省略は設計上の決定である。ユーザー定義関数がないことにより、ソーシャルレイヤーを通じた合成が促される。エラーメッセージがないことにより、初心者は赤いエラーテキストの画面に遭遇しない。ネットワークがないことにより、各プログラムは自己完結的で安全に実行できる。
472
473これは次の原則に従う。言語の制約はその機能と同様に創作空間を定義する~\citep{papert1980mindstorms, compton2015casual}。\kl{} はたまたまアートもできる汎用言語ではない。アート\emph{以外}のことができない芸術言語である。
474
475\section{組み込み関数の完全索引}
476
477\begin{table}[h]
478\small
479\centering
480\begin{tabularx}{\columnwidth}{Xlr}
481\toprule
482\textbf{カテゴリ} & \textbf{数} & \textbf{主要関数} \\
483\midrule
484グラフィックス & 9 & wipe, ink, line, box, circle \\
485変換 & 11 & scroll, zoom, spin, blur, suck \\
486数学 & 14 & +, -, *, /, random, sin, cos \\
487色彩 & 19+ & red, blue, fade, rainbow, zebra \\
488システム/ディスプレイ & 9 & width, height, frame, time \\
489制御フロー & 7 & def, if, repeat, once, let \\
490テキスト/出力 & 4 & write, type, paste, print \\
491入力 & 3 & pen, hand, gamepad \\
492オーディオ & 6 & mic, melody, overtone, sound \\
4933Dグラフィックス & 8 & cube, form, trans, move, scale \\
494合成 & 4 & \$code, layer, bake, embed \\
495データ & 4 & list, get, set, let \\
496\midrule
497\textbf{合計} & \textbf{118} & \\
498\bottomrule
499\end{tabularx}
500\caption{カテゴリ別の全118組み込み関数。}
501\label{tab:builtins}
502\end{table}
503
504\section{例:完全なプログラム}
505
506軌道運動する音響反応パーティクルフィールドを描画する完全な \kl{} プログラム:
507
508\begin{lstlisting}
509"black"
510(def vol (+ 5 (* (mic) 0.2)))
511(repeat 50 i
512 (def angle (* i 0.1256))
513 (def r (+ 20 (* vol (sin (+ (* frame 0.02) angle)))))
514 (def cx (+ 64 (* r (cos (+ angle (* frame 0.01))))))
515 (def cy (+ 64 (* r (sin (+ angle (* frame 0.01))))))
516 (ink (+ 100 (* i 3)) 50 (+ 150 (* i 2)))
517 (circle cx cy (+ 1 (random 3))))
518(blur 1)
519(zoom 1.002)
520\end{lstlisting}
521
522このプログラムは、黒い背景を設定し、マイク振幅を読み取り、音に反応して軌道運動する50個のパーティクルを描画し、計算されたグラデーションで着色し、わずかなぼかしを適用し、ゆっくりズームインする。60 FPSで動作する。わずか12行。インポート不要、セットアップ関数不要、アニメーションループ不要、イベントリスナー不要。
523
524\vspace{0.5em}
525\noindent\textbf{ORCID:} \href{https://orcid.org/0009-0007-4460-4913}{0009-0007-4460-4913}
526
527\bibliographystyle{plainnat}
528\bibliography{references}
529
530\end{document}