- JavaScript 62.3%
- C# 31.8%
- PowerShell 3.9%
- HTML 2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Replaces the log1p-compressed whole-spectrum flux with four-band flux in dB, a two-frame max-filtered reference, a per-band median+8 MAD threshold with a per-band minimum rise, and one refractory period. Level-independent. tools/onset-bench.mjs synthesises kick/snare/hat patterns with known onset times (3 patterns x 3 tempos x 3 levels x 3 beds = 81 signals), scores hit rate, false positives and median timing at 30 fps and 512-sample hops. tools/onset-legacy.mjs freezes the old detector for the before numbers. Synthetic only. Nothing was listened to; no real music, no real GPU. Corpus adjustments made after the first baseline run: coincident kick+snare count as one onset; voices end in a 60 ms fade because truncation clicks read as onsets in the near-silent gaps; hats raised relative to the snare tail. Baseline was rerun after each change. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
| docs | ||
| scripts | ||
| src/Perlines | ||
| web | ||
| .gitignore | ||
| Perlines.sln | ||
| README.md | ||
Perlines
Perlines turns music into a storm of Perlin-noise trails. Two implementations live here:
web/(v2, browser): zero-install WebAudio + WebGL2 visualizer. Static folder, no build, no dependencies. File and microphone input, onset detection, key estimate that tints the scene, three scenes (aurora disk, burning water, vector trails). Entry:node web/tools/serve.mjs, thenhttp://localhost:8080/; analysis inweb/src/dsp.js; testscd web && npm test; details inweb/README.md. Status: no human has watched it run. It has synthetic-signal tests and headless-Chrome captures only; no real-GPU frame-time measurement exists yet (web/BENCH.md).src/Perlines/(Fensalir client, C#): the 2012 Aethervis trail idea as a client of the Fensalir D3D12 renderer. Described below.
The Fensalir client: Perlines is the 2012 Aethervis trail idea rebuilt as a Fensalir client: audio becomes a rolling field resource that Fensalir's renderer draws as a storm of curl-noise trails, with no private line renderer in the client.
Valuable here: the signal path. src/Perlines/PerlinesSignalProcessor.cs turns audio into FFT energy, adaptively whitens it per band, detects the key, and projects bins onto musical scale-note lanes. src/Perlines/PerlinesRuntime.cs writes one Float32 column per frame into a rolling field resource and hands it to Fensalir (Perlin4D.cs and SmoothNoise.cs supply the noise). It is a worked example of a Fensalir client that owns a signal and leaves visibility, reservoir reuse, bloom and reconstruction to the renderer.
Problem it solves: the Unity version owned trails through LineRenderer and TrailRenderer objects, so the renderer could not reason about them. Here the renderer owns the trails and Perlines owns only the signal.
Entry points: client project src/Perlines/Perlines.csproj (solution Perlines.sln); design and authority map in docs/system-map.md; launched through Fensalir's scripts/dev-reload.ps1. Requires a sibling checkout of GameCult/Fensalir (Windows, D3D12).
Status: live as a demo. Input is a Fensalir-owned Windows system-loopback stem when one is available, otherwise a procedural fallback signal. Last commit 2026-05-31.
Run
From the root of the Fensalir checkout (Perlines checked out beside it):
.\scripts\dev-reload.ps1 -ClientProject ..\Perlines\src\Perlines\Perlines.csproj
Headless smoke test, also from Fensalir:
.\scripts\dev-reload.ps1 -Headless -ClientProject ..\Perlines\src\Perlines\Perlines.csproj
scripts/run-dev.ps1 and scripts/capture-headless.ps1 in this repo wrap the same launch and a headless PNG capture, but both hardcode the Fensalir location as E:\Projects\Fensalir, which does not exist on current workstations. Edit that path before running them.
Live Model
- Perlines owns procedural audio/FFT/whitening and field-resource uploads.
- Fensalir owns the Win32 host, D3D12 renderer, TubeField compute/render lowering, shared reservoir, and presentation denoising.
- The rolling spectrum is a below-native field evidence source, not a private line renderer.
- The spline lanes are assigned to notes in the detected key instead of arbitrary spectrum bins.
- Each rendered spline is one note lane evolving over the rolling time window.
- A Fensalir spline presentation turns that reservoir into the old radial Perlines trail storm with a divergence-free curl-noise flow, while TubeField evidence remains available to the shared reservoir path.
- Low-energy bands taper and fade out instead of leaving permanent bright strokes.