Monorepo for Aesthetic.Computer aesthetic.computer
core ac-strudel
27 files

README.md

Notepat for Strudel #

Open the demo, then press Play. All four tracks enter on the first beat: tonic melody, a fifth above it, a chord, and bass. Random rests only occur after that opening. The same address evaluates a new seed every ten minutes: key, notes, and rests change when you open it or press Update. During playback, Perlin noise and different signal periods evolve timbre, filters, stereo position, and levels. The key does not abruptly change at a clock boundary during an existing run. The source includes annotated, independently commentable tracks and a solo lab for Will. Replace Date.now() with a fixed timestamp to keep a variation. To use the instrument in another pattern:

await import('https://pat.aesthetic.computer/s')
note("c3 eb3 g3 bb3").s('ac_glass').n("<0.2 0.8>")

Marimbaba arrangements:

  • Marimbaba: the written 24-bar melody at 56 BPM in 3/4, with a reduced marimba/bass/chord arrangement.
  • Marimbaba Orbit: the same melody at 84 BPM, with a feedback-FM double and moving stereo/delay.

Append /source to either URL for annotated import-based source, or /paste for the self-contained version. These adapt pop/marimba/marimbaba.np, not the released master and its later renderer additions. build-tracks.mjs translates every score token and checks that the five sections total 72 beats. Attribution: @jeffrey / aesthetic.computer.

Stone Wattajetta is a compact instrumental reinterpretation at 132 BPM: twelve active parts using ten AC voices. The editable score is 49 lines / 2,528 UTF-8 bytes, down from 88 / 4,714, while the number of distinct sounds doubles from five to ten. Strudel's scale, palindrome, struct, and euclidRot replace the JavaScript score generator. The E/G/A/D roots retain their 18-bar cycle; a rephrased 17-note stone melody crosses a seven-note Orbit counterline, marimba answers, Bloom chords, and Notepat fifth stabs. Sub/kick/bells enter immediately; all parts enter in bar one. Shakers grow through 5/7/9/11 hits over 72 bars and rotate five steps per bar; independent signals evolve brightness, ring, stereo, and chord level.

Annotated source and self-contained paste remain available for Will. The paste embeds the synth library and is consequently larger than the editable import-based score. stone-score.strudel preserves the earlier cursor-based adaptation locally. Neither arrangement reproduces the current 144-bar club master, accelerando, FEM bodies, vocals, or found effects. Pattern reference: Strudel time modifiers.

Sound Recipe
ac_stone Designed inharmonic bar, modes 1:2.756:5.404; .n() changes brightness/ring; an approximation, not FEM
ac_water Rising sine chirp, 0.55× to target pitch; .n() changes droplet length
ac_kick Falling sine, roughly 126→43 Hz; .n() changes pitch attack and decay
ac_marimba Rosewood modes 1:4:9.2, independently decaying; .n() controls brightness and ring
ac_orbit Delayed feedback FM, four interlocking pulses, moving stereo and modulation depth
ac_glass Metallic FM, triangle fifth, inharmonic partial, decaying brightness
ac_swarm Detuned saws, triangle fifth, sine sub, drifting pitch
ac_bloom Triangle/sine layers, gentle FM, moving stereo position and filter
ac_triangle_fifth Triangle plus a 1.5× fifth, levels 0.42 + 0.12
ac_triangle Single triangle
ac_sine Single sine
ac_major Sine chord, semitones 0, 4, 7
ac_minor Sine chord, semitones 0, 3, 7
ac_sus2 Sine chord, semitones 0, 2, 7

The original six recipes come from fedac/native/pieces/notepat.mjs: the touchscreen triangle Shift alternate and keyboard Control/Alt chords. Web Audio uses band-limited oscillators; native mixer saturation, echo, and speaker coloration are not included. Chords are level-scaled for headroom. Glass, swarm, bloom, and orbit are new extensions of those sounds. On these four, .n(0) through .n(1) changes FM depth, detuning, and brightness; it can be patterned.

FM, feedback, detuning, envelopes, LFOs, and seeded composition are established techniques. This package's identity is the particular Notepat-derived recipes, their tuning/layer balance, and their evolving arrangement, not a novel synthesis algorithm. Filters, reverb, delay, and pattern signals in the example come from Strudel. Custom voices do not implement every built-in synth control; use .n() for their internal modulation rather than Strudel's .fm(). The marimba is a modal reduction of pop/marimba/synths/marimba.mjs; it omits that renderer's mallet convolution and resonator-tube simulation.

Use note() or freq() for pitch and Strudel's attack, decay, sustain, release, gain, pan, filter, delay, and reverb controls. The original voices default to a 20 ms attack, full sustain, and 100 ms release; the new voices have their own envelopes. Water and kick use .n() for their percussive decay; they accept attack/release but ignore sustain/decay. The kick has a fixed 43 Hz destination regardless of the pattern's note. No external code dependencies are downloaded by the module; it registers with the running Strudel audio API.

For a copy-and-paste version, paste all of pat.aesthetic.computer/paste (notepat-paste.strudel) into Strudel. It contains the same voices and example, with no hosted import. Regenerate it and the two Strudel links with node ac-strudel/build.mjs.

example.strudel is the complete example, also served at /source. node ac-strudel/build.mjs && node ac-strudel/deploy.mjs publishes the dedicated ac-strudel-notepat Cloudflare Worker on AC's account. The Worker bundles the source, permits cross-origin imports, and redirects / to Strudel's example URL. It stores no user data and makes no upstream requests. The original assets.aesthetic.computer/strudel/ files remain a compatibility mirror.

API reference: https://strudel.cc/technical-manual/sounds/

Validation: node ac-strudel/verify.mjs opens the actual Strudel editor in headless Chrome with a local module response; LIVE=1 node ac-strudel/verify.mjs checks the published URL. Both exercise the import and paste versions. Offline audio checks cover non-silent output, triangle/fifth spectral levels, bounded peaks, silent tails, timbre changes at both macro extremes, and exactly-once cleanup after normal and early stops, including every modulation oscillator. The scheduler check also verifies simultaneous first-beat onsets from all four demo tracks, and treats Strudel's logged getTrigger errors as failures. node ac-strudel/verify-tracks.mjs checks both Marimbaba arrangements and their standalone versions against all 50 pitched events in the original score; LIVE=1 checks the published synth. All active tracks must trigger together. node ac-strudel/verify-stone.mjs checks import/paste playback, immediate entrances from all twelve parts, ten distinct voices, valid pitches across 72 bars, uninterrupted kick/gallop, changing shaker density, and timbre motion.