demo(blob): dub-space arrangement + a beat-locked particle field - #354
Merged
Conversation
Reworks the blob demo's music and its particle field so the visuals read as caused by the kick rather than as ambient swarm motion. Arrangement - New `stab` track: sparse minor chords on the off-beats through a Surge FX send (a low `type` lands in the delay/reverb family), smeared into dub space. The FX call is guarded — an FX quirk must not break the build. - Bass reworked from one step-loop into two figures: sustained sub roots in the intro (a deep bed, out of the kick's way), then OFF-beat sub in verse/chorus so it interlocks with the four-on-the-floor kick instead of doubling it — bounce rather than a wall. Gains pulled back accordingly (bass 0.78 → 0.52, lead 0.5 → 0.36) and master 0.55 → 0.5 now that a fourth track sums in. - Drums lead on kick + off-beat open hat, with the 16th closed-hat roll held back for the chorus. Particle field The old field wired the arp note-instances into `attractors`, so the swarm chased the beads around the wheel — which read as aimless "swarming to different places", not as a response to the music. Attract is now OFF and the baseline emission_rate is ZERO: `transport.beat_pulse` spawns a fresh wave near the centre on each kick, `speed` flings it outward, and a short lifetime + high drag clear it before the next beat, so the motes are visibly BORN on the beat. Bass nudges the newborn wave's size/speed; highs brighten it. Stage Darkened toward near-black (bg 0.02 → 0.008) with the background-breathing mapping cut 0.08 → 0.015, so the glows carry the image instead of a lifted background. Camera pulled in (orbit radius 17 → 12.5) and bloom opened up slightly to match. Generated projects under examples/demos/projects/ are gitignored, so this script is the source of truth; it has been run and produces a playable 4-track project.
jeffcrouse
enabled auto-merge (squash)
August 16, 2026 14:20
Contributor
Production gate (core): ✅ PASS
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Reworks the blob demo's music and its particle field so the visuals read as caused by the kick rather than as ambient swarm motion.
The particle field was the problem
The old field wired the arp note-instances into the
attractorsport, so the swarm chased the beads around the wheel. In motion that reads as aimless "swarming to different places" — busy, but not obviously caused by anything you can hear.Attract is now off, and the baseline
emission_rateis zero — at rest there are no particles at all.transport.beat_pulsespawns a fresh wave near the centre on each kick,speedflings it outward, and a short lifetime plus high drag clear it before the next beat. You see the motes born on the beat instead of an old cloud glowing. Bass nudges the newborn wave's size and speed; highs brighten it.Arrangement
stabtrack — sparse minor chords on the off-beats through a Surge FX send (a lowtypelands in the delay/reverb family), smeared into dub space. The FX call is guarded: an FX quirk must not break the build.Stage
Darkened toward near-black (bg 0.02 → 0.008), with the background-breathing mapping cut 0.08 → 0.015 so the glows carry the image rather than a lifted background. Camera pulled in (orbit radius 17 → 12.5) and bloom opened slightly to match.
Notes
Generated projects under
examples/demos/projects/are gitignored, so this script is the source of truth. It has been run and produces a playable 4-track project (Cassette Drums / bass / stab / lead).Content-only — no engine or app code is touched.
🤖 Generated with Claude Code
Measured reactivity — the burst claim did NOT verify
Ran
analyze_output(mode="av")against the chorus on a healthy app, five captures over ~38s(arm → fill → judge each time, since the perception ring is throttled to ~12fps and holds ~4–8s):
onset_response_rateenergy_motion_correlation13 onsets,
onset_response_rate0.0 on every capture. Mean motion correlation 0.21 against aThe audio side was verified independently first — rapid-polling the drum track during playback
(444 polls / 5s) gives peak transient 1.0, so the kick is firing hard and there genuinely are
onsets to respond to.
So the beat-locked particle wave does not register as a visual event on the kick. The modest
motion correlation is consistent with the blob's pre-existing continuous bass/mid mappings, which
this PR does not change.
Untested hypothesis for follow-up: the burst may be too brief or too small to move a frame-difference
metric —
lifetime=0.6withrelease=0.13on theemission_ratemapping. That needs a parametersweep, not more reasoning.
The arrangement work (stab track, interlocking off-beat sub, darkened stage) stands on its own and is
unaffected by this finding.