···396396 d->fmt_ctx = NULL;
397397 }
398398399399+ // Free peaks
400400+ if (d->peaks) {
401401+ free(d->peaks);
402402+ d->peaks = NULL;
403403+ d->peak_count = 0;
404404+ }
405405+399406 d->loaded = 0;
400407 d->finished = 0;
401408 d->decoding = 0;
402409 d->ring_write = 0;
403410 d->ring_read = 0;
411411+}
412412+413413+// Generate decimated max-amplitude peaks for the loaded file.
414414+// Opens a SECOND independent FFmpeg context (so it doesn't disturb playback)
415415+// and decodes the entire file once, recording max abs value per chunk.
416416+int deck_decoder_generate_peaks(ACDeckDecoder *d, int target_count) {
417417+ if (!d || !d->loaded || !d->path[0]) return -1;
418418+ if (d->peaks) { free(d->peaks); d->peaks = NULL; d->peak_count = 0; }
419419+ if (target_count <= 0) target_count = 1024;
420420+421421+ AVFormatContext *fmt = NULL;
422422+ if (avformat_open_input(&fmt, d->path, NULL, NULL) < 0) return -1;
423423+ if (avformat_find_stream_info(fmt, NULL) < 0) {
424424+ avformat_close_input(&fmt);
425425+ return -1;
426426+ }
427427+ int sidx = av_find_best_stream(fmt, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
428428+ if (sidx < 0) { avformat_close_input(&fmt); return -1; }
429429+ AVStream *st = fmt->streams[sidx];
430430+ const AVCodec *codec = avcodec_find_decoder(st->codecpar->codec_id);
431431+ if (!codec) { avformat_close_input(&fmt); return -1; }
432432+ AVCodecContext *cctx = avcodec_alloc_context3(codec);
433433+ avcodec_parameters_to_context(cctx, st->codecpar);
434434+ if (avcodec_open2(cctx, codec, NULL) < 0) {
435435+ avcodec_free_context(&cctx);
436436+ avformat_close_input(&fmt);
437437+ return -1;
438438+ }
439439+440440+ // Estimate total samples for chunking
441441+ double duration = d->duration;
442442+ if (duration <= 0) duration = 60.0; // fallback
443443+ int sample_rate = cctx->sample_rate;
444444+ long total_samples = (long)(duration * sample_rate);
445445+ if (total_samples < target_count) total_samples = target_count;
446446+ long samples_per_chunk = total_samples / target_count;
447447+ if (samples_per_chunk < 1) samples_per_chunk = 1;
448448+449449+ d->peaks = (float *)calloc(target_count, sizeof(float));
450450+ if (!d->peaks) {
451451+ avcodec_free_context(&cctx);
452452+ avformat_close_input(&fmt);
453453+ return -1;
454454+ }
455455+ d->peak_count = target_count;
456456+457457+ // Setup converter to mono float
458458+ SwrContext *swr = NULL;
459459+ AVChannelLayout out_layout = AV_CHANNEL_LAYOUT_MONO;
460460+ swr_alloc_set_opts2(&swr, &out_layout, AV_SAMPLE_FMT_FLT, sample_rate,
461461+ &cctx->ch_layout, cctx->sample_fmt, cctx->sample_rate,
462462+ 0, NULL);
463463+ swr_init(swr);
464464+465465+ AVPacket *pkt = av_packet_alloc();
466466+ AVFrame *frame = av_frame_alloc();
467467+ float chunk_max = 0.0f;
468468+ long sample_idx = 0;
469469+ int peak_idx = 0;
470470+ float *outbuf = (float *)malloc(sample_rate * sizeof(float));
471471+ int outbuf_size = sample_rate;
472472+473473+ while (av_read_frame(fmt, pkt) >= 0 && peak_idx < target_count) {
474474+ if (pkt->stream_index != sidx) { av_packet_unref(pkt); continue; }
475475+ if (avcodec_send_packet(cctx, pkt) < 0) { av_packet_unref(pkt); continue; }
476476+ while (avcodec_receive_frame(cctx, frame) >= 0) {
477477+ int max_out = frame->nb_samples + 256;
478478+ if (max_out > outbuf_size) {
479479+ outbuf = (float *)realloc(outbuf, max_out * sizeof(float));
480480+ outbuf_size = max_out;
481481+ }
482482+ uint8_t *out_ptr[1] = { (uint8_t *)outbuf };
483483+ int out_n = swr_convert(swr, out_ptr, max_out,
484484+ (const uint8_t **)frame->data, frame->nb_samples);
485485+ for (int i = 0; i < out_n; i++) {
486486+ float v = outbuf[i];
487487+ if (v < 0) v = -v;
488488+ if (v > chunk_max) chunk_max = v;
489489+ sample_idx++;
490490+ if (sample_idx >= samples_per_chunk) {
491491+ if (peak_idx < target_count) {
492492+ d->peaks[peak_idx++] = chunk_max;
493493+ }
494494+ chunk_max = 0.0f;
495495+ sample_idx = 0;
496496+ }
497497+ }
498498+ }
499499+ av_packet_unref(pkt);
500500+ }
501501+ // Final chunk
502502+ if (peak_idx < target_count && chunk_max > 0) {
503503+ d->peaks[peak_idx++] = chunk_max;
504504+ }
505505+ // Fill remaining
506506+ while (peak_idx < target_count) d->peaks[peak_idx++] = 0;
507507+508508+ free(outbuf);
509509+ av_frame_free(&frame);
510510+ av_packet_free(&pkt);
511511+ swr_free(&swr);
512512+ avcodec_free_context(&cctx);
513513+ avformat_close_input(&fmt);
514514+515515+ return target_count;
404516}
405517406518void deck_decoder_destroy(ACDeckDecoder *d) {
+10
fedac/native/src/audio-decode.h
···5656 void *codec_ctx; // AVCodecContext*
5757 void *swr; // SwrContext*
5858 int stream_idx; // audio stream index
5959+6060+ // Waveform peaks (decimated max-amplitude samples for visualization)
6161+ // Generated once on load by scanning the entire file via separate pass.
6262+ float *peaks; // [0..1] amplitude peaks
6363+ int peak_count; // number of peaks (typically 1024)
5964} ACDeckDecoder;
60656166// Create a decoder instance for the given output sample rate
···72777378// Unload current file and stop thread (decoder can be reused with another load)
7479void deck_decoder_unload(ACDeckDecoder *d);
8080+8181+// Generate peaks for the loaded file (call after deck_decoder_load).
8282+// Decodes the entire file once and writes max-amplitude peaks per chunk.
8383+// Safe to call from main thread; takes a few hundred ms for typical tracks.
8484+int deck_decoder_generate_peaks(ACDeckDecoder *d, int target_count);
75857686// Destroy decoder and free all resources
7787void deck_decoder_destroy(ACDeckDecoder *d);
+2
fedac/native/src/audio.c
···17411741 int ret = deck_decoder_load(dk->decoder, path);
17421742 if (ret == 0) {
17431743 dk->active = 1;
17441744+ // Generate waveform peaks for visualization (decoded in background thread)
17451745+ deck_decoder_generate_peaks(dk->decoder, 1024);
17441746 }
17451747 return ret;
17461748}
+18
fedac/native/src/js-bindings.c
···21362136 return JS_UNDEFINED;
21372137}
2138213821392139+// sound.deck.getPeaks(deck) — returns Float32Array of normalized peak amplitudes
21402140+static JSValue js_deck_get_peaks(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) {
21412141+ (void)this_val;
21422142+ if (argc < 1 || !current_rt || !current_rt->audio) return JS_NULL;
21432143+ int deck; JS_ToInt32(ctx, &deck, argv[0]);
21442144+ if (deck < 0 || deck >= AUDIO_MAX_DECKS) return JS_NULL;
21452145+ ACDeck *dk = ¤t_rt->audio->decks[deck];
21462146+ if (!dk->decoder || !dk->decoder->peaks || dk->decoder->peak_count <= 0) return JS_NULL;
21472147+21482148+ // Build a JS array from the peak data
21492149+ JSValue arr = JS_NewArray(ctx);
21502150+ for (int i = 0; i < dk->decoder->peak_count; i++) {
21512151+ JS_SetPropertyUint32(ctx, arr, i, JS_NewFloat64(ctx, dk->decoder->peaks[i]));
21522152+ }
21532153+ return arr;
21542154+}
21552155+21392156// sound.deck.setVolume(deck, vol)
21402157static JSValue js_deck_set_volume(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) {
21412158 (void)this_val;
···22872304 JS_SetPropertyStr(ctx, deck_obj, "setVolume", JS_NewCFunction(ctx, js_deck_set_volume, "setVolume", 2));
22882305 JS_SetPropertyStr(ctx, deck_obj, "setCrossfader", JS_NewCFunction(ctx, js_deck_set_crossfader, "setCrossfader", 1));
22892306 JS_SetPropertyStr(ctx, deck_obj, "setMasterVolume", JS_NewCFunction(ctx, js_deck_set_master_vol, "setMasterVolume", 1));
23072307+ JS_SetPropertyStr(ctx, deck_obj, "getPeaks", JS_NewCFunction(ctx, js_deck_get_peaks, "getPeaks", 1));
2290230822912309 // Deck state (read-only, rebuilt each frame)
22922310 JSValue decks_arr = JS_NewArray(ctx);
···40404141| Paper | Format | PDF | Source |
4242|-------|--------|-----|--------|
4343+| Aesthetic Computer Demo (C&C 2026) | ACM Demo (LaTeX) | `cc-demo-2026/demo.pdf` | `cc-demo-2026/demo.tex` |
4344| The URL Tradition | arXiv (LaTeX) | `arxiv-url-tradition/url-tradition.pdf` | `arxiv-url-tradition/url-tradition.tex` |
4445| The Potter and the Prompt | arXiv (LaTeX) | `arxiv-holden/holden.pdf` | `arxiv-holden/holden.tex` |
4546| Two Departments, One Building | arXiv (LaTeX) | `arxiv-ucla-arts/ucla-arts.pdf` | `arxiv-ucla-arts/ucla-arts.tex` |
···114115115116| Venue | Type | Deadline | Conference Date | Status |
116117|-------|------|----------|-----------------|--------|
117117-| [ACM C&C 2026](https://cc.acm.org/2026/) | Demos | Apr 16, 2026 | Jul 13–16, London | GO |
118118-| [ICCC 2026](https://computationalcreativity.net/iccc26/) | Short Papers | Apr 24, 2026 | Jun 29–Jul 3, Coimbra | GO |
118118+| [ACM C&C 2026](https://cc.acm.org/2026/demos/) | Demos | Apr 16, 2026 | Jul 13–16, London | DRAFTING (`cc-demo-2026/`) |
119119+| [ICCC 2026](https://computationalcreativity.net/iccc26/) | Short Papers | May 15, 2026 | Jun 29–Jul 3, Coimbra | GO |
120120+| [SIGGRAPH Asia 2026](https://asia.siggraph.org/2026/submissions/) | Art Gallery | Jun 18, 2026 | Dec 1–4, Kuala Lumpur | NEW |
121121+| [SIGGRAPH Asia 2026](https://asia.siggraph.org/2026/submissions/posters/) | Posters | Jul 31, 2026 | Dec 1–4, Kuala Lumpur | NEW |
122122+| [SIGGRAPH Asia 2026](https://asia.siggraph.org/2026/submissions/real-time-live/) | Real-Time Live! | Aug 7, 2026 | Dec 1–4, Kuala Lumpur | NEW |
123123+| [ArtsIT 2026](https://artsit.eai-conferences.org/2026/) | Full Papers | Jun 1, 2026 | Dec 2–4, Bratislava | NEW |
119124| [JOSS](https://joss.theoj.org/) | Software Paper | Rolling | Rolling | Anytime |
120120-| [Scores for Social Software](https://socialsoftware.art/) | Card Deck | Mar 31, 2026 | Apr 2, UCLA | GO |
121125122126### Deadlines Passed (Track for Next Year)
123127124124-NIME, xCoAx, ACM CHI, SIGGRAPH, Prix Ars Electronica, S+T+ARTS — all missed for 2026. Track 2027 calls.
128128+NIME (Feb 12), xCoAx (Feb 15), ACM CHI, SIGGRAPH main, Prix Ars Electronica (Mar 9), S+T+ARTS, ISEA (Nov 2025), Creative Capital (Apr 2), Scores for Social Software (Mar 31) — all missed for 2026. Track 2027 calls.
125129126130## Funding Sources
127131
papers/cc-demo-2026/demo.pdf
This is a binary file and will not be displayed.
+219
papers/cc-demo-2026/demo.tex
···11+% !TEX program = xelatex
22+\documentclass[manuscript,anonymous,review]{acmart}
33+44+% Remove ACM-specific metadata for submission
55+\settopmatter{printacmref=false}
66+\renewcommand\footnotetextcopyrightpermission[1]{}
77+\pagestyle{plain}
88+99+\usepackage{booktabs}
1010+\usepackage{listings}
1111+1212+% === Code listing styles ===
1313+\definecolor{kw}{RGB}{119,51,170}
1414+\definecolor{fn}{RGB}{0,136,170}
1515+\definecolor{str}{RGB}{170,120,0}
1616+\definecolor{num}{RGB}{204,0,102}
1717+\definecolor{cmt}{RGB}{102,102,102}
1818+1919+\lstdefinelanguage{acjs}{
2020+ morekeywords=[1]{function,export,const,let,return,if,else},
2121+ morekeywords=[2]{wipe,ink,line,box,circle,write,screen,event},
2222+ sensitive=true,
2323+ morecomment=[l]{//},
2424+ morestring=[b]",
2525+ morestring=[b]',
2626+}
2727+2828+\lstset{
2929+ language=acjs,
3030+ basicstyle=\ttfamily\small,
3131+ keywordstyle=[1]\color{kw}\bfseries,
3232+ keywordstyle=[2]\color{fn}\bfseries,
3333+ commentstyle=\color{cmt}\itshape,
3434+ stringstyle=\color{str},
3535+ breaklines=true,
3636+ frame=single,
3737+ rulecolor=\color{gray!30},
3838+ backgroundcolor=\color{gray!5},
3939+ xleftmargin=0.5em,
4040+ xrightmargin=0.5em,
4141+ aboveskip=0.5em,
4242+ belowskip=0.5em,
4343+}
4444+4545+\begin{document}
4646+4747+\title{Aesthetic Computer: A Prompt-Based Runtime for Creative Computing}
4848+\subtitle{Demo at ACM Creativity \& Cognition 2026}
4949+5050+\author{Anonymous}
5151+\authornote{Submission anonymized for review.}
5252+\affiliation{\institution{Anonymous Institution}}
5353+5454+\begin{abstract}
5555+We demonstrate Aesthetic Computer, a mobile-first runtime and social network for creative computing that replaces the conventional editor interface with a text prompt. Users type short, memorizable commands to launch interactive programs called \emph{pieces}---drawing tools, sound instruments, games, generative artworks, and social spaces---running entirely in the browser on any device. The demo invites attendees to interact with the system on their own phones: play a musical keyboard, draw collaboratively, write generative art in a minimal Lisp dialect, and experience how prompt-based navigation produces fluency through memorization rather than menu traversal. The system comprises 63,000 lines of open-source runtime code, 354 built-in pieces, 265 user-published works, and 2,800+ registered users.
5656+\end{abstract}
5757+5858+\keywords{creative computing, creative coding, prompt interface, mobile-first, social computing, live coding, generative art}
5959+6060+\maketitle
6161+6262+% ============================================================
6363+\section{Introduction}
6464+6565+Creative coding platforms---Processing, p5.js, Scratch, OpenProcessing---share a common assumption: the user interacts with an \emph{editor}. Aesthetic Computer (AC) starts from a different premise. The primary interface is a text prompt into which users type short names to launch interactive programs. There is no file browser, no project panel, no menu bar. The experience is closer to a musical instrument than a development environment: users discover commands through exploration, build muscle memory through repetition, and improvise by recombining pieces fluently.
6666+6767+This demo lets conference attendees experience that interaction model directly. Visitors will navigate the prompt on their own devices, discover pieces by typing guesses, play instruments, draw, write code, and share their work---all within minutes, with no installation and no prior knowledge.
6868+6969+% ============================================================
7070+\section{System Overview}
7171+7272+AC is a browser-native platform comprising four subsystems:
7373+7474+\begin{enumerate}
7575+ \item \textbf{Boot loader} --- initializes WebSocket connections, service workers, and offline storage in parallel. Subsequent visits load from cache for near-instant startup.
7676+ \item \textbf{BIOS} --- the runtime orchestrator (20,935 lines). Manages the 60fps rendering loop, routes input events (keyboard, touch, mouse, gamepad, MIDI), and coordinates piece lifecycle transitions.
7777+ \item \textbf{Disk API} --- provides the complete API surface for pieces (15,879 lines). All graphics are immediate-mode: every pixel is drawn every frame, with no retained scene graph.
7878+ \item \textbf{Module loader} --- streams JavaScript modules over WebSocket for fast loading, with IndexedDB caching and HTTP fallback.
7979+\end{enumerate}
8080+8181+The system runs entirely client-side with no installation. Backend services handle authentication, storage, and real-time communication, but the creative runtime is the browser itself.
8282+8383+% ============================================================
8484+\section{The Piece Model}
8585+8686+A piece is a single \texttt{.mjs} (JavaScript) or \texttt{.lisp} (KidLisp) file that exports lifecycle functions:
8787+8888+\begin{lstlisting}
8989+function boot({ wipe, screen }) {
9090+ // Runs once when piece loads
9191+}
9292+9393+function paint({ wipe, ink, circle, screen }) {
9494+ wipe("navy")
9595+ ink("pink")
9696+ circle(screen.width / 2,
9797+ screen.height / 2, 50)
9898+}
9999+100100+function act({ event: e }) {
101101+ if (e.is("touch")) { /* respond */ }
102102+}
103103+104104+export { boot, paint, act };
105105+\end{lstlisting}
106106+107107+The API provides graphics primitives (\texttt{wipe}, \texttt{ink}, \texttt{line}, \texttt{box}, \texttt{circle}, \texttt{poly}), text rendering, audio synthesis, input handling, networking, and UI components---all passed as destructured parameters to each lifecycle function. This follows Processing's sketchbook model---one file per explorable idea---combined with URL-addressability: every piece, parameter combination, and user's work is a shareable URL.
108108+109109+The system includes 354 built-in pieces and 265 user-published works spanning drawing tools, musical instruments, generative artworks, multiplayer games, and social utilities.
110110+111111+% ============================================================
112112+\section{The Prompt as Instrument}
113113+114114+The prompt is AC's primary navigation interface, implementing over 60 commands. Instead of browsing menus, users type:
115115+116116+\begin{itemize}
117117+ \item \texttt{notepat} --- a musical keyboard with synthesis and sequencing
118118+ \item \texttt{wand} --- a freehand drawing tool
119119+ \item \texttt{line} --- geometric drawing
120120+ \item \texttt{chat} --- live text chat
121121+ \item \texttt{mood} --- post a short status update
122122+ \item \texttt{@user/piece} --- load someone else's published work
123123+\end{itemize}
124124+125125+Returning to the prompt is always one gesture away. Users report discovering pieces by typing guesses---\texttt{piano}, \texttt{draw}, \texttt{rain}---and finding what exists. This accidental discovery is a deliberate design outcome of a flat namespace. Over time, users build a personal repertoire of memorized commands, and their navigation becomes improvisational---rapid, fluent transitions between creative contexts without loading screens or navigation hierarchies.
126126+127127+The metaphor is literal: like learning an instrument, the initial experience is exploration and discovery; the mature experience is fluency and flow.
128128+129129+% ============================================================
130130+\section{KidLisp: A Language for Beginners and AI}
131131+132132+KidLisp is a minimal Lisp dialect designed for generative art, with 118 built-in functions across 12 categories (drawing, color, transformation, math, animation, audio). A complete KidLisp program that draws concentric circles:
133133+134134+\begin{lstlisting}
135135+(repeat i 12
136136+ (ink (color (* i 20) 100 200))
137137+ (circle:filled (/ width 2)
138138+ (/ height 2)
139139+ (* i 20)))
140140+\end{lstlisting}
141141+142142+The language has no file I/O, networking, or string manipulation, which makes user-submitted code safe to execute. Over 16,000 KidLisp programs have been written---many by children and beginners collaborating with language models. The constrained vocabulary means AI-generated code is readable and editable by novices: a human can change a number, see the result, and build intuition for what the code does.
143143+144144+KidLisp programs are URL-addressable: short codes like \texttt{\$cow} resolve to stored programs and execute immediately.
145145+146146+% ============================================================
147147+\section{Social Infrastructure}
148148+149149+Unlike platforms where social features are external services, AC integrates social infrastructure directly into the runtime:
150150+151151+\begin{itemize}
152152+ \item \textbf{Handles} --- users register names through the prompt (\texttt{@handle}), which serve as namespaces for published work.
153153+ \item \textbf{Real-time chat} --- WebSocket-based messaging, with 18,000+ messages exchanged.
154154+ \item \textbf{Moods} --- short text posts visible on profiles, dual-written to ATProto for federation with the broader social web.
155155+ \item \textbf{Live profiles} --- real-time scorecards showing online status, current piece, and creative activity.
156156+ \item \textbf{Multiplayer} --- collaborative drawing, music-making, and shared sessions via WebSocket + UDP channels.
157157+\end{itemize}
158158+159159+2,800+ users are registered. The social layer drives retention: users check moods, respond in chat, and discover pieces through social activity rather than search.
160160+161161+% ============================================================
162162+\section{Distribution: The Pack System}
163163+164164+The \texttt{pack} command bundles any piece into a single, self-contained HTML file. The output includes the piece code, all runtime dependencies, and embedded fonts---a file that works offline with no server. This enables distribution via email, USB drives, QR codes, or blockchain minting. A packed piece is a permanent artifact that survives platform shutdown.
165165+166166+% ============================================================
167167+\section{Demo Experience}
168168+169169+The demo station provides:
170170+171171+\begin{enumerate}
172172+ \item \textbf{A large display} running AC at full screen, showing a rotating selection of pieces via the merry sequencing system.
173173+ \item \textbf{Attendees' own devices.} Visitors navigate to the URL on their phones and interact immediately---no app install, no account required. A printed card lists starting commands.
174174+ \item \textbf{Guided activities:}
175175+ \begin{itemize}
176176+ \item \emph{Play:} Type \texttt{notepat} and perform a melody on the touchscreen keyboard.
177177+ \item \emph{Draw:} Type \texttt{wand} or \texttt{line} and create a drawing.
178178+ \item \emph{Code:} Enter a KidLisp short code (\texttt{\$cow}) and modify a generative artwork live.
179179+ \item \emph{Share:} Type \texttt{chat} and send a message visible to all demo participants.
180180+ \item \emph{Pack:} Bundle a piece into an offline HTML file and take it home.
181181+ \end{itemize}
182182+ \item \textbf{Collaborative moment.} Multiple attendees on the same piece simultaneously, drawing or making music together in real time.
183183+\end{enumerate}
184184+185185+The demo requires only a browser and an internet connection. No accounts, downloads, or plugins are needed to participate.
186186+187187+% ============================================================
188188+\section{Relevance to Creativity for Change}
189189+190190+AC's design proposes that creative software can be organized around memorization and improvisation rather than navigation and configuration. This produces a qualitatively different relationship between people and computation---one where the barriers to entry are curiosity and a URL, not software literacy and a desktop computer.
191191+192192+The system is open source (ISC license), runs on any device with a browser, and packs creative work into permanent, self-contained files. KidLisp's role as a bridge between human beginners and AI collaborators demonstrates one model for how creative coding might evolve: not by making tools more complex, but by making languages simple enough that both humans and machines can read them.
193193+194194+% ============================================================
195195+196196+\bibliographystyle{ACM-Reference-Format}
197197+\begin{thebibliography}{9}
198198+199199+\bibitem{reas2007}
200200+Casey Reas and Ben Fry. 2007. \textit{Processing: A Programming Handbook for Visual Designers and Artists}. MIT Press.
201201+202202+\bibitem{mccarthy2015}
203203+Lauren McCarthy. 2015. p5.js. \url{https://p5js.org}
204204+205205+\bibitem{resnick2009}
206206+Mitchel Resnick et al. 2009. Scratch: Programming for All. \textit{Communications of the ACM} 52, 11 (2009), 60--67.
207207+208208+\bibitem{hydra2019}
209209+Olivia Jack. 2019. Hydra: Live Coding Networked Visuals. In \textit{Proceedings of the International Conference on Live Coding (ICLC)}.
210210+211211+\bibitem{roos2023}
212212+Felix Roos and Alex McLean. 2023. Strudel: Live Coding Patterns on the Web. In \textit{Proceedings of the International Conference on New Interfaces for Musical Expression (NIME)}.
213213+214214+\bibitem{nelson1974}
215215+Theodor H. Nelson. 1974. \textit{Computer Lib / Dream Machines}. Self-published.
216216+217217+\end{thebibliography}
218218+219219+\end{document}
papers/cc-demo-2026/tech-requirements.pdf
This is a binary file and will not be displayed.
+67
papers/cc-demo-2026/tech-requirements.tex
···11+% !TEX program = xelatex
22+\documentclass[manuscript,anonymous,review]{acmart}
33+44+\settopmatter{printacmref=false}
55+\renewcommand\footnotetextcopyrightpermission[1]{}
66+\pagestyle{plain}
77+88+\begin{document}
99+1010+\title{Technical Demonstration Requirements}
1111+\subtitle{Aesthetic Computer --- ACM C\&C 2026 Demo}
1212+1313+\author{Anonymous}
1414+\affiliation{\institution{Anonymous Institution}}
1515+1616+\maketitle
1717+1818+\section{Space and Setup}
1919+2020+\begin{itemize}
2121+ \item \textbf{Table space:} Standard demo table (approximately 180cm $\times$ 75cm).
2222+ \item \textbf{Display:} One external monitor (24" or larger), provided by the authors if not available. HDMI input preferred.
2323+ \item \textbf{Laptop:} Authors will bring a laptop running Chrome to drive the main display.
2424+ \item \textbf{Audio:} Small powered speaker or headphones for the demo station. Musical pieces (notepat, tone) produce audio that is part of the demonstration.
2525+ \item \textbf{Power:} Two power outlets (laptop + monitor or speaker).
2626+\end{itemize}
2727+2828+\section{Network Requirements}
2929+3030+\begin{itemize}
3131+ \item \textbf{Internet connection:} Required. The system loads from a public URL. Wi-Fi is sufficient.
3232+ \item \textbf{Bandwidth:} Minimal after initial load ($<$1 MB cached). Real-time features (chat, multiplayer) use WebSocket connections with low bandwidth overhead.
3333+ \item \textbf{Ports:} Standard HTTPS (443) and WSS (443). No special firewall rules needed.
3434+ \item \textbf{Fallback:} If internet is unreliable, the demo can run from a local development server on the presenter's laptop. Attendees would connect via a local Wi-Fi hotspot.
3535+\end{itemize}
3636+3737+\section{Attendee Participation}
3838+3939+\begin{itemize}
4040+ \item Attendees use \textbf{their own phones, tablets, or laptops}---no dedicated hardware required.
4141+ \item The system works in any modern browser (Chrome, Safari, Firefox, Edge). No app installation or account creation is needed.
4242+ \item A printed reference card will list starting commands and a QR code for the URL.
4343+ \item Participation is drop-in: attendees can join or leave at any time during the demo session.
4444+\end{itemize}
4545+4646+\section{Accessibility}
4747+4848+\begin{itemize}
4949+ \item The system accepts keyboard, touch, mouse, and gamepad input.
5050+ \item Text rendering uses high-contrast colors on solid backgrounds.
5151+ \item The prompt interface is compatible with screen readers (standard HTML input element).
5252+ \item Audio is not required for the visual/drawing portions of the demo.
5353+\end{itemize}
5454+5555+\section{Setup and Teardown}
5656+5757+\begin{itemize}
5858+ \item \textbf{Setup time:} 10 minutes (open laptop, connect display, verify internet).
5959+ \item \textbf{Teardown time:} 5 minutes.
6060+ \item \textbf{No special installation:} The entire system runs in a web browser. No software needs to be installed on venue machines.
6161+\end{itemize}
6262+6363+\section{Presenter Attendance}
6464+6565+One author will be present throughout the demo session to guide attendees, explain the system, and facilitate collaborative moments (multi-user drawing and music sessions).
6666+6767+\end{document}