From 08cc7c635590f093cf0fb8f80c05c7cf0e5c9c6d Mon Sep 17 00:00:00 2001 From: BenStullsBets Date: Thu, 2 Jul 2026 05:47:19 -0700 Subject: [PATCH] docs(audio): binaural stress-relief candidate pool + local review page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 11 CC0 stereo binaural/entrainment candidates (verified on freesound) for evolving the Music option into a crossfading stress-relief set. Durable record in docs/binaural-candidate-pool.md; interactive audition gallery at simulator/static/review_binaural.html (gitignored local-only, like the other review galleries — streams the CC0 previews, tick-to-keep + copy picks). Co-Authored-By: Claude Opus 4.8 --- .gitignore | 1 + docs/binaural-candidate-pool.md | 68 ++++++++++++++++++++++++ simulator/e2e/tests/auto-advance.spec.ts | 19 ++++--- 3 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 docs/binaural-candidate-pool.md diff --git a/.gitignore b/.gitignore index d515d75..74dbe87 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/docs/binaural-candidate-pool.md b/docs/binaural-candidate-pool.md new file mode 100644 index 0000000..5f69ea1 --- /dev/null +++ b/docs/binaural-candidate-pool.md @@ -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 (#1–7) needs headphones.** The beat *is* the L/R frequency + difference, so on speakers it collapses to a steady carrier tone (no entrainment). + **#8–11** are ambient sub-bass / pulsing drones that keep the calm feel on speakers. +- **Band coverage:** heavy on **delta (0.5–1.5 Hz)** + one clean **theta (4 Hz, #2)**. + **No CC0 alpha (8–12 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 #8–11 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//_-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]]). diff --git a/simulator/e2e/tests/auto-advance.spec.ts b/simulator/e2e/tests/auto-advance.spec.ts index 88d5205..fb5e4cf 100644 --- a/simulator/e2e/tests/auto-advance.spec.ts +++ b/simulator/e2e/tests/auto-advance.spec.ts @@ -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 });