Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 530 lines 21 kB view raw
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}