Experience tuning: mood-through-morphs fix, auto-advance, label wrap, binaural candidates #33

Merged
benstull merged 10 commits from feat/experience-tuning into main 2026-07-03 01:00:22 +00:00
3 changed files with 80 additions and 8 deletions
Showing only changes of commit 08cc7c6355 - Show all commits
+1
View File
@@ -23,6 +23,7 @@ simulator/sample_media/**/*.m4a
# Local-only candidate review galleries (re-buildable; not shipped content).
simulator/static/review.html
simulator/static/review_audio.html
simulator/static/review_binaural.html
# Editor annotation/comment-thread metadata (not project content)
.threads/
+68
View File
@@ -0,0 +1,68 @@
# Binaural / entrainment candidate pool — stress-relief "Music" tracks (2026-07-02)
Candidates for evolving the **Music** audio option into a stress-relief set of
**binaural-beat / brainwave-entrainment** tracks that **crossfade between each
other** (not a single loop). Operator brief: "binaural beats for stress relief."
**All 11 below are CC0** (public domain — no attribution legally required; we credit
anyway as courtesy), **all stereo**, all sourced from freesound.org and license-
verified by fetching each page. Review gallery (gitignored, local-only, like
`review_audio.html`): `simulator/static/review_binaural.html` → open
`/review_binaural.html` with the sim server running. It streams each track's public
HQ preview so you can audition + tick keepers.
## Caveats (operator, read before picking)
- **True binaural (#17) needs headphones.** The beat *is* the L/R frequency
difference, so on speakers it collapses to a steady carrier tone (no entrainment).
**#811** are ambient sub-bass / pulsing drones that keep the calm feel on speakers.
- **Band coverage:** heavy on **delta (0.51.5 Hz)** + one clean **theta (4 Hz, #2)**.
**No CC0 alpha (812 Hz)** track surfaced — widen to CC-BY (FMA/ccMixter) if wanted.
- **No clean CC0/CC-BY isochronic or monaural** (the speaker-correct entrainment type)
was found — every hit was NC/SA or unlicensed (see rejects). For speaker playback,
lean on #811 for the "beat" feel.
- **Previews vs originals:** the `cdn.freesound.org/…-hq.mp3` URLs are public streamable
previews (verified live, HTTP 206). The **originals** (WAV/AIF/full-MP3) need a free
freesound login; CC0 permits self-hosting, so for keepers download the originals and
host on R2 — do not hot-link the CDN in production.
## Candidates
| # | id | title | artist | source page | license | dur | type | beat / carrier |
|---|---|---|---|---|---|---|---|---|
| 1 | `fs75309` | 60-64-delta | iantm | https://freesound.org/people/iantm/sounds/75309/ | CC0 | 0:30 | true-binaural | 4 Hz · 60/64 Hz |
| 2 | `fs457654` | Binaural Beats (Theta Waves 4 Hz) | Fabrizio84 | https://freesound.org/people/Fabrizio84/sounds/457654/ | CC0 | 30:00 | true-binaural | 4 Hz theta |
| 3 | `fs803742` | 1.23456789 Hz binaural beat (69L/70.23R) | itchytooth | https://freesound.org/people/itchytooth/sounds/803742/ | CC0 | 60:00 | true-binaural | 1.23 Hz delta · 69/70.23 Hz |
| 4 | `fs414271` | Binaural Delta 440/440.5 Hz | pbabin | https://freesound.org/people/pbabin/sounds/414271/ | CC0 | 10:00 | true-binaural | 0.5 Hz · 440/440.5 Hz |
| 5 | `fs414272` | Binaural Delta 500/501.5 Hz | pbabin | https://freesound.org/people/pbabin/sounds/414272/ | CC0 | 10:00 | true-binaural | 1.5 Hz · 500/501.5 Hz |
| 6 | `fs414273` | Binaural Delta 52/52.5 Hz | pbabin | https://freesound.org/people/pbabin/sounds/414273/ | CC0 | 10:00 | true-binaural | 0.5 Hz · 52/52.5 Hz |
| 7 | `fs414274` | Binaural Delta 60/61.5 Hz | pbabin | https://freesound.org/people/pbabin/sounds/414274/ | CC0 | 10:00 | true-binaural | 1.5 Hz · 60/61.5 Hz |
| 8 | `fs856225` | Delta Pulse Subharmonic Drone (MANTICE) | bassimat | https://freesound.org/people/bassimat/sounds/856225/ | CC0 | 5:00 | ambient+beats (speaker-ok) | delta sub-bass (procedural) |
| 9 | `fs854874` | Void Monolith Subharmonic Drone (MANTICE) | bassimat | https://freesound.org/people/bassimat/sounds/854874/ | CC0 | 5:00 | ambient (speaker-ok) | dark sub-drone |
| 10 | `fs860122` | Expanding & Vibrating Stereo Pulsating Drone (MANTICE) | bassimat | https://freesound.org/people/bassimat/sounds/860122/ | CC0 | 2:00 | ambient+beats (speaker-ok) | slow stereo pulsation |
| 11 | `fs493524` | Pulse Breath *(lower pref)* | phylobates | https://freesound.org/people/phylobates/sounds/493524/ | CC0 | 1:40 | ambient binaural | octaves of G / G♭ |
Preview MP3s (for the review page) follow `https://cdn.freesound.org/previews/<dir>/<id>_<uploader>-hq.mp3`
— exact URLs are embedded in `review_binaural.html`.
## Rejected / could not verify
- **archive.org "Binaural Beats Alpha/Beta/Theta/Delta"** & **"Isochronic Tones &
Binaural Beats Combined"** (loopool / Jean-Paul Garnier) — **CC BY-NC-SA 3.0** (NC).
The most promising isochronic set — rejected for the NC clause.
- **archive.org "Om Alpha Brainwave Entrainment Loop"** (Entraino / KS Chauhan;
freesound chauhans/100370) — **CC BY-NC 3.0**. Rejected (NC).
- **archive.org "1hr 30 Min Theta Binaural Beat (7 Hz)"** (Chari G) — no license shown.
Rejected (unverifiable).
- **freesound "deadthetawaves.wav"** (NoiseCollector/43295) — license fine (**CC BY 3.0**)
but "evil sounding loop of the living dead" — rejected for *fit*, not license. Back
pocket only if an unsettling deep-scale track is ever wanted.
- **TunePocket / dialedggsound / miraclefrequencies / audio.com "Theta 7Hz"** —
"royalty-free"/commercial pages, murky redistribution, no per-track CC license.
## Next
Operator auditions `review_binaural.html`, ticks keepers (Copy picks). Then we wire the
playback: the **Music** source becomes a multi-track set that crossfades between the kept
tracks (architecture decision — replace vs. join the ethereal loop — deferred to that
step; see [[audio-music-option]]).
+11 -8
View File
@@ -24,15 +24,18 @@ test("auto-advances one altitude (descending) after the idle interval", async ({
expect(after).toBe((start + 1) % n); // descended exactly one, wraps
});
test("toggling Auto-advance off keeps the altitude parked", async ({ page }) => {
await boot(page, 1000);
await page.evaluate(() => {
const c = document.querySelector("#auto-advance") as HTMLInputElement;
c.checked = false;
c.dispatchEvent(new Event("change", { bubbles: true }));
});
test("Auto-advance off keeps the altitude parked", async ({ page }) => {
// Disable BEFORE launch so the idle timer never arms (deterministic — no race with
// the first interval firing during boot).
await page.addInitScript(() => { (window as any).__hefAutoAdvanceMs = 800; });
await page.goto("/");
await page.waitForFunction(() => (window as any).__hefReady === true, null, { timeout: 45_000 });
await page.evaluate(() => { (document.querySelector("#auto-advance") as HTMLInputElement).checked = false; });
await page.locator("#welcome-launch").click();
await page.waitForSelector("#welcome", { state: "detached", timeout: 10_000 });
const start = await idx(page);
await page.waitForTimeout(2600); // well past two intervals
await page.waitForTimeout(2200); // well past two 800ms intervals
expect(await idx(page)).toBe(start); // never moved
});