@denaudio/den 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/LICENSE-APACHE +202 -0
- package/LICENSE-MIT +21 -0
- package/README.md +102 -2
- package/dist/biquad-eq.d.ts +11 -0
- package/dist/biquad-eq.js +35 -0
- package/dist/catalog-filter-math.d.ts +4 -0
- package/dist/catalog-filter-math.js +30 -0
- package/dist/character-filter.d.ts +13 -0
- package/dist/character-filter.js +53 -0
- package/dist/convolution-spectrum.d.ts +25 -0
- package/dist/convolution-spectrum.js +82 -0
- package/dist/convolution.d.ts +15 -0
- package/dist/convolution.js +81 -0
- package/dist/crossover.d.ts +11 -0
- package/dist/crossover.js +17 -0
- package/dist/curve-shaper.d.ts +26 -0
- package/dist/curve-shaper.js +73 -0
- package/dist/delay-fx.d.ts +37 -0
- package/dist/delay-fx.js +84 -0
- package/dist/delay-readhead.d.ts +19 -0
- package/dist/delay-readhead.js +54 -0
- package/dist/delay-settings.d.ts +55 -0
- package/dist/delay-settings.js +20 -0
- package/dist/drive.d.ts +24 -0
- package/dist/drive.js +116 -0
- package/dist/dual-head-delay.d.ts +28 -0
- package/dist/dual-head-delay.js +77 -0
- package/dist/dynamics.d.ts +61 -0
- package/dist/dynamics.js +130 -0
- package/dist/envelope.d.ts +34 -0
- package/dist/envelope.js +62 -0
- package/dist/filter.d.ts +9 -0
- package/dist/filter.js +34 -0
- package/dist/filterbank-vocoder.d.ts +35 -0
- package/dist/filterbank-vocoder.js +52 -0
- package/dist/formant-bank.d.ts +15 -0
- package/dist/formant-bank.js +28 -0
- package/dist/freeze-reverb.d.ts +35 -0
- package/dist/freeze-reverb.js +61 -0
- package/dist/frequency-shifter.d.ts +24 -0
- package/dist/frequency-shifter.js +57 -0
- package/dist/gate.d.ts +2 -0
- package/dist/gate.js +12 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +12 -0
- package/dist/instrument-example.d.ts +12 -0
- package/dist/instrument-example.js +29 -0
- package/dist/instrument-settings.d.ts +95 -0
- package/dist/instrument-settings.js +36 -0
- package/dist/instrument.d.ts +42 -0
- package/dist/instrument.js +166 -0
- package/dist/lfo.d.ts +19 -0
- package/dist/lfo.js +55 -0
- package/dist/live-buffer.d.ts +39 -0
- package/dist/live-buffer.js +52 -0
- package/dist/live-granular.d.ts +41 -0
- package/dist/live-granular.js +64 -0
- package/dist/lookahead-limiter.d.ts +31 -0
- package/dist/lookahead-limiter.js +67 -0
- package/dist/loop-crossfade.d.ts +28 -0
- package/dist/loop-crossfade.js +72 -0
- package/dist/modulation-fx.d.ts +47 -0
- package/dist/modulation-fx.js +58 -0
- package/dist/modulation.d.ts +132 -0
- package/dist/modulation.js +228 -0
- package/dist/mpe-expression.d.ts +36 -0
- package/dist/mpe-expression.js +73 -0
- package/dist/multiband-dynamics.d.ts +50 -0
- package/dist/multiband-dynamics.js +60 -0
- package/dist/musical-controls.d.ts +76 -0
- package/dist/musical-controls.js +125 -0
- package/dist/musical-examples.d.ts +21 -0
- package/dist/musical-examples.js +142 -0
- package/dist/musical-materials.d.ts +110 -0
- package/dist/musical-materials.js +56 -0
- package/dist/oscillator.d.ts +10 -0
- package/dist/oscillator.js +35 -0
- package/dist/oversampled-drive.d.ts +19 -0
- package/dist/oversampled-drive.js +99 -0
- package/dist/performance.d.ts +61 -0
- package/dist/performance.js +241 -0
- package/dist/pitch-quantizer.d.ts +26 -0
- package/dist/pitch-quantizer.js +88 -0
- package/dist/prepared-convolution.d.ts +22 -0
- package/dist/prepared-convolution.js +99 -0
- package/dist/resident-recorder.d.ts +28 -0
- package/dist/resident-recorder.js +68 -0
- package/dist/resident-time-stretch.d.ts +44 -0
- package/dist/resident-time-stretch.js +135 -0
- package/dist/resonator.d.ts +32 -0
- package/dist/resonator.js +63 -0
- package/dist/reverb.d.ts +27 -0
- package/dist/reverb.js +52 -0
- package/dist/sample.d.ts +113 -0
- package/dist/sample.js +212 -0
- package/dist/source.d.ts +58 -0
- package/dist/source.js +113 -0
- package/dist/spatial-chains.d.ts +48 -0
- package/dist/spatial-chains.js +76 -0
- package/dist/spectral-fft.d.ts +21 -0
- package/dist/spectral-fft.js +74 -0
- package/dist/spectral-freeze.d.ts +22 -0
- package/dist/spectral-freeze.js +74 -0
- package/dist/spectral-gate.d.ts +21 -0
- package/dist/spectral-gate.js +58 -0
- package/dist/spectral-stft.d.ts +13 -0
- package/dist/spectral-stft.js +69 -0
- package/dist/spectral-texture.d.ts +42 -0
- package/dist/spectral-texture.js +141 -0
- package/dist/spectral.d.ts +16 -0
- package/dist/spectral.js +10 -0
- package/dist/state-variable-filter.d.ts +17 -0
- package/dist/state-variable-filter.js +25 -0
- package/dist/stereo-delay.d.ts +45 -0
- package/dist/stereo-delay.js +70 -0
- package/dist/virtual-analog.d.ts +26 -0
- package/dist/virtual-analog.js +66 -0
- package/dist/voice-policy.d.ts +37 -0
- package/dist/voice-policy.js +245 -0
- package/dist/wavetable-bands.d.ts +37 -0
- package/dist/wavetable-bands.js +145 -0
- package/dist/wavetable-read.d.ts +6 -0
- package/dist/wavetable-read.js +11 -0
- package/dist/wavetable.d.ts +29 -0
- package/dist/wavetable.js +49 -0
- package/dist/windowed-pitch-shift.d.ts +34 -0
- package/dist/windowed-pitch-shift.js +51 -0
- package/docs/catalog-audition.md +76 -0
- package/docs/catalog-filters.md +125 -0
- package/docs/catalog-modulation-fx.md +220 -0
- package/docs/catalog-status.md +431 -0
- package/docs/character-filter.md +139 -0
- package/docs/contracts.md +131 -0
- package/docs/control-modulation.md +194 -0
- package/docs/convolution.md +45 -0
- package/docs/curve-shaper.md +117 -0
- package/docs/delay-fx-capture-findings.json +134 -0
- package/docs/delay-fx.md +202 -0
- package/docs/delay-readhead.md +121 -0
- package/docs/delay-settings-candidate.json +333 -0
- package/docs/delay-settings.md +111 -0
- package/docs/dependency-findings.md +61 -0
- package/docs/deployment-status.md +37 -0
- package/docs/drive.md +152 -0
- package/docs/dual-head-delay.md +131 -0
- package/docs/dynamics.md +180 -0
- package/docs/envelope-integer-staging.md +64 -0
- package/docs/filter-materialization-results.json +71 -0
- package/docs/filter-materialization.md +135 -0
- package/docs/filter-oscillator.md +126 -0
- package/docs/filterbank-vocoder-entry.md +58 -0
- package/docs/freeze-reverb.md +179 -0
- package/docs/frequency-shifter.md +133 -0
- package/docs/frontend-audition.md +22 -0
- package/docs/gain-schedule-verification.md +53 -0
- package/docs/initial-acceptance.md +79 -0
- package/docs/instrument-performance.md +191 -0
- package/docs/instrument-settings.md +130 -0
- package/docs/instrument.md +204 -0
- package/docs/integration-candidate.md +114 -0
- package/docs/live-buffer.md +163 -0
- package/docs/live-granular.md +179 -0
- package/docs/lookahead-multiband.md +183 -0
- package/docs/loop-crossfade.md +99 -0
- package/docs/mpe-expression.md +65 -0
- package/docs/musical-clock-seek-boundary.md +31 -0
- package/docs/musical-controls-contract.md +144 -0
- package/docs/musical-examples.md +255 -0
- package/docs/oversampled-drive.md +153 -0
- package/docs/performance.md +53 -0
- package/docs/pitch-quantizer.md +55 -0
- package/docs/prepared-convolution.md +188 -0
- package/docs/realtime-audition.md +63 -0
- package/docs/resident-recorder.md +151 -0
- package/docs/resident-time-stretch.md +190 -0
- package/docs/sample.md +191 -0
- package/docs/sound-audition-headroom.md +103 -0
- package/docs/sources.md +81 -0
- package/docs/spatial-chains-entry.md +250 -0
- package/docs/spectral-freeze-entry.md +130 -0
- package/docs/spectral-gate-entry.md +130 -0
- package/docs/spectral-large-candidate.md +74 -0
- package/docs/spectral-texture-entry.md +174 -0
- package/docs/spectral.md +118 -0
- package/docs/virtual-analog.md +77 -0
- package/docs/voice-policy.md +38 -0
- package/docs/wavetable-bands.md +138 -0
- package/docs/wavetable.md +101 -0
- package/docs/windowed-pitch-shift.md +112 -0
- package/package.json +269 -4
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
# Catalog expansion candidates
|
|
2
|
+
|
|
3
|
+
This document tracks the additive catalog beyond the initial candidate merged in
|
|
4
|
+
PR26/PR30. New modules are CANDIDATE. They do not inherit the initial sounds'
|
|
5
|
+
listening feedback, approved-golden status, or any runtime clearance.
|
|
6
|
+
|
|
7
|
+
## Included lanes
|
|
8
|
+
|
|
9
|
+
| Module group | Public entry | Verification boundary |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| Multimode SVF, peaking/shelf EQ, formant bank, LR4 crossover | `/state-variable-filter`, `/biquad-eq`, `/formant-bank`, `/crossover` | Independent static/moving-coefficient, endpoint, state and public-package checks; the rejected direct-form EQ is retained as a nonshipping regression fixture |
|
|
12
|
+
| Peak/RMS follower, compressor/expander/gate/duck | `/dynamics` | Independent ballistics/gain-law, tiny/full-range/state/stereo and isolated three-rate package tests; timing is diagnostic rather than a browser deadline guarantee |
|
|
13
|
+
| Hard/soft/asymmetric/fold drive, direct/ADAA quality, reduction | `/drive` | Independent curve/quadrature/alias/phase/state and public-package tests; intentional reduction aliasing and ADAA tradeoffs are explicit |
|
|
14
|
+
| Flanger/phaser, ping-pong/multitap delay, small algorithmic FDN | `/modulation-fx`, `/stereo-delay`, `/reverb` | Independent impulse, modulation energy, timing, stereo, tail/decay and installed-package checks; actual 48 kHz worklet gate |
|
|
15
|
+
| PM/FM, fixed additive/unison banks, modal/comb resonators | `/source`, `/resonator` | Independent sideband/alias, recurrence/convolution, bounded-control, linearity/state and three-rate public-package checks; the rejected output-normalized comb transient remains an executable counterexample |
|
|
16
|
+
| Musical clock/sequence, MSEG, held/random modulation, fixed MIDI arp | `/modulation` | Independent rational-clock, BigInt PRNG, curve, reset/seek/state, unsigned native MIDI timestamp/order and public-package checks; external MIDI delivery is unverified |
|
|
17
|
+
| Resident sample, mapped multisample, bounded grains | `/sample` | Native PCM ingress, loaded-length boundaries, independent playback/grain/replacement/state oracles and maximum fixed-capacity public-package proof; loaded runtime cost is not inferred from unloaded driver profiles |
|
|
18
|
+
| Resident wavetable and prepared pitch bands, pulse/triangle, seeded noise | `/wavetable`, `/virtual-analog` | Independent interpolation/quadrature/Fourier/PRNG, tiny/full-range/state and three-rate packed evidence; host-prepared harmonic truncation and native band/frame morph are covered; interpolation images and fast-control aliasing remain |
|
|
19
|
+
| Sustain/expression policy, glide, 12-TET tuning | `/performance` | Independent native MIDI identity/ordering/pedal/controller and tuning/glide oracles; fixed four-voice/eight-identity bound, no general MPE |
|
|
20
|
+
| FFT/STFT identity and small fixed partitioned convolution | `/spectral`, `/convolution` | Independent DFT/WOLA/direct-FIR, arbitrary reset/snapshot and nested native scheduler proofs; public STFT N<=1024 now has persistent hop-phase proof; convolution B<=32/IR<=128 remains a feasibility boundary |
|
|
21
|
+
| Explicit-feedback character filter | `/character-filter` | Independent small-signal/DC/nonlinear feedback, all-state bounds, alias, tiny-state and packed evidence; not analog-circuit equivalence |
|
|
22
|
+
| Hilbert additive-Hz frequency shift | `/frequency-shifter` | Independent FIR/sideband/phase/state and packed checks in the documented useful band; delayed bypass and retained alias/headroom limits |
|
|
23
|
+
| Lookahead sample-peak limiter and compensated three-band dynamics | `/lookahead-limiter`, `/multiband-dynamics` | Independent sliding-window ceiling, latency/reset/full-range/state and complex allpass reconstruction; neither true-peak nor general real-time clearance |
|
|
24
|
+
| Editable piecewise-linear curves | `/curve-shaper` | 2..17 native audio-rate ordinates, independent interval quadrature, corrected tiny-knot behavior and same-schema state; higher-order AA remains separate; fixed oversampling has its own entry below |
|
|
25
|
+
| Fixed 2×/4× oversampled drive | `/oversampled-drive` | Independent literal zero-stuff/FIR/decimation, curve/phase/state and packed proof; matched filtered dry, 32-sample bulk delay, precursors and high-treble loss are explicit |
|
|
26
|
+
| Dual-head delay-time transitions | `/dual-head-delay` | Independent absolute-history crossfade/queue/timing/reset/state oracles, maximum fixed capacity and packed tests; fixed heads do not imply click-free or general pitch/time behavior |
|
|
27
|
+
| Bounded input pitch shift | `/windowed-pitch-shift` | Two complementary moving windows, independent coherent-frequency/alias/cancellation/latency/state oracles and packed tests; arbitrary tones may color or cancel, no general time stretch |
|
|
28
|
+
| Manual lower-zone expression routing | `/mpe-expression` | Native MIDI member/master bend/pressure/CC74 routing, independent identity/controller/snapshot/audio proof; no full MPE pedal/RPN/hardware claim |
|
|
29
|
+
| Framewise spectral gate | `/spectral-gate` | Independent dense-DFT/bin-mask/WOLA, frame-sampled controls, phase/state and public-package checks; no-hook STFT identity is byte-identical and processed tails require2N drain |
|
|
30
|
+
| Prepared-spectrum convolution | `/prepared-convolution` | Certified unchanged host packet, fixed B128/P64 and8192 taps, independent direct/quantized FIR, native load/reset/state and public-package proof; quantization, preload and deadline limits remain |
|
|
31
|
+
| Crossfaded resident loops | `/loop-crossfade` | Independent forward/reverse/fractional/overlap/replacement/state proof; effective period is L-F, no unchanged-duration or arbitrary-content seamlessness claim |
|
|
32
|
+
| Native bounded take recorder | `/resident-recorder` | Independent sample-by-sample append/pause/full/reset, loaded-prefix/readback, finite-range, maximum-capacity and native snapshot/public-package proof; no device capture or streaming layer |
|
|
33
|
+
| Rolling accepted-write history | `/live-buffer` | Independent chronological reference, statement-order, fractional/expired ages, pause/reset/revision/snapshot and maximum fixed-capacity proof; distinct from ResidentSample and not a live grain scheduler |
|
|
34
|
+
| Fixed-pool live-granular reader | `/live-granular` | Independent absolute source-position, endpoint/allocation/expiry, latching, tiny/full-range and joint-history snapshot proof; explicit writer ordering and trigger, no density clock or host transport |
|
|
35
|
+
| Controlled FDN frozen tail | `/freeze-reverb` | Independent recurrence, input suppression, bounded transition, frozen-energy drift, native history restore and public-package proof; finite-precision and runtime limits remain |
|
|
36
|
+
| Experimental bounded resident WSOLA | `/resident-time-stretch` | Independent exact rational active-duration/EOF, grain-local sampling/search, native state and public-package proof; severe padded-tail carrier loss, dominant-frequency deviation and CPU deadline misses prevent transparent-quality or realtime acceptance |
|
|
37
|
+
| Octave-periodic musical pitch quantizer | `/pitch-quantizer` | Independent exhaustive-lattice nearest/tie/Schmitt/reset/state and public-package checks, including sparse-array rejection; bounded pitch-control quantization, not audio pitch detection or event-time quantization |
|
|
38
|
+
| Bin-centered spectral freeze | `/spectral-freeze` | Independent dense DFT and circular-shift WOLA, every supported hop/reset/state class and public-package checks; held output is N-periodic with captured-window modulation, not transparent or phase-locked sustain |
|
|
39
|
+
| Frequency blur and gain-capped cross-synthesis | `/spectral-texture` | Independent dense DFT/WOLA, synchronized dual-input frames, fixed phase-floor/gain-cap and all-hop joint-state proof; N<=256, deliberate weak-bin phase jumps, no speech or phase-vocoder quality claim |
|
|
40
|
+
| Fixed filter-bank vocoder | `/filterbank-vocoder` | Independent bandpass/envelope/phase/selectivity/gain/reset/state and public-package checks; 1–8 caller-specified bands, sampled rectified amplitude, no speech-quality or flat-reconstruction claim |
|
|
41
|
+
| Four complete A/B musical examples | `/musical-examples` | Original deterministic materials, complete native controls, 24 three-rate A/B rows, repeat/state/tail/headroom and independent musical checks; new audio is CANDIDATE |
|
|
42
|
+
|
|
43
|
+
Contracts, controls and limitations are detailed in [filters](catalog-filters.md),
|
|
44
|
+
[dynamics](dynamics.md), [drive](drive.md), [modulation/reverb](catalog-modulation-fx.md),
|
|
45
|
+
[sources/resonators](sources.md), [control modulation](control-modulation.md),
|
|
46
|
+
[samples](sample.md), [wavetable](wavetable.md), [prepared pitch bands](wavetable-bands.md), [VA/noise](virtual-analog.md),
|
|
47
|
+
[performance](performance.md), [spectral framing](spectral.md), [convolution](convolution.md),
|
|
48
|
+
[character filter](character-filter.md), [frequency shift](frequency-shifter.md),
|
|
49
|
+
[limiter/multiband](lookahead-multiband.md), [editable curves](curve-shaper.md)
|
|
50
|
+
[fixed oversampling](oversampled-drive.md), [dual-head transitions](dual-head-delay.md),
|
|
51
|
+
[windowed pitch shift](windowed-pitch-shift.md), [lower-zone expression](mpe-expression.md),
|
|
52
|
+
[spectral gating](spectral-gate.md), [prepared convolution](prepared-convolution.md),
|
|
53
|
+
[crossfaded loops](loop-crossfade.md), [take recording](resident-recorder.md),
|
|
54
|
+
[rolling live history](live-buffer.md),
|
|
55
|
+
[live-granular reading](live-granular.md),
|
|
56
|
+
[frozen tails](freeze-reverb.md), [experimental resident WSOLA](resident-time-stretch.md),
|
|
57
|
+
[pitch quantization](pitch-quantizer.md), [bin-centered spectral freeze](spectral-freeze-entry.md),
|
|
58
|
+
[frequency blur and cross-synthesis](spectral-texture-entry.md),
|
|
59
|
+
[filter-bank vocoder](filterbank-vocoder-entry.md),
|
|
60
|
+
and [musical examples](musical-examples.md).
|
|
61
|
+
All remain editable unworklet subgraphs. No parameter, MIDI, state, routing,
|
|
62
|
+
loader, asset or test framework is introduced. Dependencies stay at unworklet 0.4.1. The only initial-DSP source exception is
|
|
63
|
+
a narrowly tested one-sample read-head construction-boundary correction; existing
|
|
64
|
+
common-rate audio/state/WASM parity is required.
|
|
65
|
+
|
|
66
|
+
`tests/catalog-composition.test.mjs` is the additional deployment-side boundary:
|
|
67
|
+
it builds the actual packed drive/dynamics composition and the nine-output FX
|
|
68
|
+
fixture into browser worklets. Native 48 kHz render, parameter edits, snapshot
|
|
69
|
+
restoration, tail decay and cleanup must pass in exact-head CI. The offline
|
|
70
|
+
component uses an independent fixed-input algebraic gain oracle. Offline success
|
|
71
|
+
at 44.1/48/96 kHz is never described as browser multi-rate support.
|
|
72
|
+
|
|
73
|
+
`tests/source-control-browser.test.mjs` adds a small seven-output source graph
|
|
74
|
+
(PM/FM, two additive partials, one unison voice, two modal modes and a comb), plus
|
|
75
|
+
native clock/sequence/MSEG/sample-and-hold/random controls. Analytic RMS/DC and frequency-bin checks, noninitial seek/held/random state,
|
|
76
|
+
reset and same-schema restore are required at actual 48 kHz. The source history
|
|
77
|
+
probe freezes nonzero phases, resets to zero, then checks recovery after restore.
|
|
78
|
+
The maximum-capacity source graph stays a separate offline/cost fixture: its
|
|
79
|
+
32 partials, eight unison voices and 16 modes have exceeded the local 128-frame
|
|
80
|
+
quantum budget. The small browser functional gate does not certify that graph's
|
|
81
|
+
real-time deadline. The fixed arpeggiator has native output-ring/timestamp evidence
|
|
82
|
+
at three offline rates; browser-to-host/device delivery is not claimed.
|
|
83
|
+
|
|
84
|
+
`tests/materials-browser.test.mjs` requires actual 48-kHz native PCM-message
|
|
85
|
+
load, short replacement, unload and persistent-asset restore. The small sample
|
|
86
|
+
fixture ties every PCM sample to its rendered position and checks bounded grains,
|
|
87
|
+
N8 STFT/short-convolution DC and held reset. Its spectral browser checks are
|
|
88
|
+
functional: exact latency and continuation remain independently proved offline.
|
|
89
|
+
A one-voice performance fixture checks native note/pressure/bend/CC input,
|
|
90
|
+
frequency-bin retuning, sustain release, transient-note snapshot behavior and
|
|
91
|
+
panic. A separate small wavetable/VA graph checks asset completeness, frequency
|
|
92
|
+
edits, discrete pulse/triangle Fourier amplitudes and seeded-noise reset.
|
|
93
|
+
|
|
94
|
+
`tests/advanced-browser.test.mjs` adds actual 48-kHz signed-shift frequency bins,
|
|
95
|
+
useful-band image rejection, linked sample-ceiling edits, and independent complex
|
|
96
|
+
APlo×APhi reconstruction. Wet compression is checked separately from the aligned
|
|
97
|
+
dry output. Editable-curve tests check the linear two-tap transfer and a changed
|
|
98
|
+
ordinate's analytical DC value. Browser reset and parameter restoration are
|
|
99
|
+
functional checks; exact timing/state continuity remain independently proved
|
|
100
|
+
offline. The character-filter packed gate separately exercises native drive,
|
|
101
|
+
resonance/pole edits and noninitial history recovery in an actual browser.
|
|
102
|
+
|
|
103
|
+
The resource limits remain explicit. Sample max32-grain and combined source
|
|
104
|
+
profiles have exceeded the quantum budget; the full multiband fixture also retains
|
|
105
|
+
measured deadline misses despite its graph-size reduction. Native-loop spectral optimization
|
|
106
|
+
reduces graph expansion, but historical cold-start and large-frame watchdog
|
|
107
|
+
failures are retained. No maximum-capacity, long-IR, larger-frame or hardware
|
|
108
|
+
real-time clearance follows from these small browser compositions.
|
|
109
|
+
|
|
110
|
+
Local socket restrictions or a missing browser binary are recorded as blocked
|
|
111
|
+
browser stages, not successful tests. The historical initial runtime remains
|
|
112
|
+
NOT_CLEARED. Full exact-head CI, independent review, completed post-Ready automated review
|
|
113
|
+
and issue resolution precede
|
|
114
|
+
merge; this document itself does not certify that a pending run has completed.
|
|
115
|
+
|
|
116
|
+
## Original catalog coverage and next lanes
|
|
117
|
+
|
|
118
|
+
| Original group | Current boundary / remaining work |
|
|
119
|
+
| --- | --- |
|
|
120
|
+
| 1. Wavetable / VA / unison | Sine/saw/unison plus resident wavetable, pulse/triangle and seeded-noise candidates. Host-prepared pitch-band tables are included with explicit interpolation-image limits; richer table materials and higher-order antialiasing remain |
|
|
121
|
+
| 2. FM / PM / additive / resonators | Bounded candidates included above with independent tuning/sideband/decay and alias evidence. General antialiasing or maximum-capacity real-time support is not implied |
|
|
122
|
+
| 3. Sample / multisample / granular | Resident one-shot/loop/reverse/slice playback, fixed mapped zones/grain pools, and separate unity-sum loop crossfades with shortened L-F period are included. Bounded native take recording, a distinct rolling accepted-write-age history, and a fixed-pool live-grain reader with explicit trigger/expiry are included. Microphone/device capture, host streaming, overdub, wider live-grain scheduling and general stretch remain |
|
|
123
|
+
| 4. Voice / note / expression | Existing voice policy and sustain/glide/tuning wrapper plus manually configured lower-zone member/master expression routing. Full MPE zone/RPN negotiation, master pedals and hardware delivery remain |
|
|
124
|
+
| 5. Modulation / sequencing | Initial LFO/follower plus bounded MSEG, held/correlated seeded modulation, clock/step and fixed-note native MIDI arp candidates. Bounded octave-periodic pitch-control quantization with explicit hysteresis, segment-relative curved ADSR and free/tempo multiwave LFOs are included. No transport synchronization, chord capture, or external host/device delivery claim |
|
|
125
|
+
| 6. Filters / EQ / formants / crossover | Clean candidate modules above. Bounded nonlinear character filter included. Broader resonator variants and analog-model/zero-delay solver claims remain separate |
|
|
126
|
+
| 7. Drive / waveshaping / reduction | Direct/ADAA fixed curves, native editable 2..17-point curves and fixed 2×/4× memoryless oversampling included, with filtered-dry/bandwidth/phase tradeoffs. General arbitrary-graph oversampling and higher-order AA remain |
|
|
127
|
+
| 8. Delay / modulation / frequency shift | Existing Delay/Chorus plus new candidates above. Bounded Hilbert additive-Hz shifter included with a useful-band limit. Fixed dual-head delay-time transitions are included with explicit queue/crossfade semantics; this is not general pitch/time processing |
|
|
128
|
+
| 9. Dynamics / limiter / multiband | Single-band dynamics, bounded lookahead/sample-peak limiter and phase-compensated three-band dynamics included. True-peak certification and universal multiband real-time performance are not inferred |
|
|
129
|
+
| 10. Reverb / convolution / special tail | Small algorithmic FDN above. Small fixed-IR convolution included with explicit block latency. Prepared-spectrum B128/P64 extends to8192 taps (170.67ms at48kHz) for bounded body/cabinet/short-space use. Controlled four-line FDN freeze/thaw is included with finite-precision limits. Fixed short-convolution/early-reflection plus parallel FDN hybrid and feedforward pitched-tail candidates are included through `/spatial-chains`. Arbitrary long-room support and regenerative shimmer remain |
|
|
130
|
+
| 11. Pitch / time / STFT | FFT/STFT identity extends through N1024 with persistent scheduling/restore phase. Bounded two-window input pitch shift is included with measured coloration/cancellation limits. Framewise spectral gating is included with calibrated linear bin thresholds and explicit ringing/tail limits. Separate bin-centered spectral freeze captures and rotates frames into an explicitly N-periodic texture, not transparent sustain. N<=256 frequency-magnitude blur uses a declared weak-bin phase floor; synchronized cross-synthesis replaces magnitudes only within a fixed carrier-gain cap. A fixed 1–8-band vocoder combines caller-provided modulator/carrier audio with rectified envelopes and explicit gains; speech quality is unverified. A bounded sparse resident WSOLA experiment adds independent duration and local-pitch controls, but general time-stretch quality remains incomplete; transparent/stereo/streaming stretching and phase-vocoder capabilities remain |
|
|
131
|
+
| 12. Concrete chains / blend | Initial instrument→Delay/drive→dynamics plus glass dyad, FM/modal hit, granular cloud and shaped echo. Fixed gains, phase/latency/tails are explicit; more combinations remain possible |
|
|
132
|
+
| 13. Sounds / configurations / materials | Initial five settings remain intact. Four new A/B compositions with original assets and candidate provenance are included; the grouped browser fixture is test-only, with its own lifecycle/gain gate; former public routes are removed, and new human listening/golden approval is not implied |
|
|
133
|
+
|
|
134
|
+
A missing advanced technique does not stop independently implementable catalog
|
|
135
|
+
work. A module name does not count as completed capability without its stated
|
|
136
|
+
contract and numerical/package evidence. Broader research and runtime limits are
|
|
137
|
+
kept separate from the useful, verified candidate surface.
|
|
138
|
+
|
|
139
|
+
The grouped [catalog audition](catalog-audition.md) exposes the four A/B musical
|
|
140
|
+
examples separately from the initial sounds. Its functional browser checks and
|
|
141
|
+
visible unity-default gain do not promote runtime or human-listening acceptance.
|
|
142
|
+
|
|
143
|
+
## Transition and expression browser boundary
|
|
144
|
+
|
|
145
|
+
`tests/transitions-browser.test.mjs` builds a small five-output public composition
|
|
146
|
+
(two-times drive, fixed-head delay, 2048-sample pitch windows and N256 STFT) plus
|
|
147
|
+
a separate one-voice/two-member MIDI composition. Native controls must produce
|
|
148
|
+
the independent FIR phase/gain, fixed-delay phase, coherent doubled/halved pitch,
|
|
149
|
+
STFT identity and member/master pitch/amplitude equations. Reset silences the
|
|
150
|
+
DSP graph; native snapshot restoration is checked as a parameter path, while
|
|
151
|
+
exact buffer/history/hop-phase continuation remains proved offline. Expression
|
|
152
|
+
checks distinguish current live transient state from fresh-instance defaults.
|
|
153
|
+
A cold live restore uses explicit native composition reset before the next fresh
|
|
154
|
+
note; unreset held notes/controllers deliberately remain current. This is 48-kHz functional evidence, not maximum-capacity,
|
|
155
|
+
all-device deadline, arbitrary-input pitch quality or full MPE acceptance.
|
|
156
|
+
|
|
157
|
+
The transition browser gate also loads a small two-frame prepared pitch-band
|
|
158
|
+
asset, checks independent low-harmonic interpolation gains and high-pitch folded
|
|
159
|
+
harmonic rejection, edits the native frame, rejects short asset playback, and
|
|
160
|
+
restores PCM/parameters before a held-reset phase check. The cycle-local reader
|
|
161
|
+
precision repair is shared by both wavetable readers; rejected prior readers and
|
|
162
|
+
actual tiny-phase/full-range counterexamples remain in nonshipping tests.
|
|
163
|
+
|
|
164
|
+
The framewise [spectral gate](spectral-gate-entry.md) adds one bounded spectral
|
|
165
|
+
operation without changing no-hook STFT output or schema. Its small browser
|
|
166
|
+
composition checks native threshold/floor edits, all-pass/fixed-floor/closed
|
|
167
|
+
limits, rendered-parameter restore and reset against exact delayed-source
|
|
168
|
+
phase/gain. These functional limits supplement, rather than replace, the
|
|
169
|
+
independent active-bin DFT/WOLA and arbitrary-phase continuation tests. The
|
|
170
|
+
corrected candidate drains2N zeros; the original N-drained artifact is retained
|
|
171
|
+
as superseded evidence, not presented as the completed effect tail.
|
|
172
|
+
|
|
173
|
+
## Prepared tails and loop browser boundary
|
|
174
|
+
|
|
175
|
+
`tests/tail-assets-browser.test.mjs` sends a full host-prepared8192-tap packet
|
|
176
|
+
through the native message path, checks the independent delayed FIR complex
|
|
177
|
+
transfer, rejects malformed metadata, unloads, replaces with a shorter IR,
|
|
178
|
+
restores native coefficients/history, and resets/restarts. The small resident
|
|
179
|
+
loop fixture compares every observed output sample to an independent scalar
|
|
180
|
+
phase/overlap equation for forward, reverse and fractional playback, and checks
|
|
181
|
+
shorter/empty replacement, held-gate invalidation, native asset/state restore
|
|
182
|
+
and reset/release. AudioContexts are suspended for synchronous multichannel
|
|
183
|
+
observation, then resumed; no alternate renderer or snapshot wrapper is used.
|
|
184
|
+
The three-rate offline gate and prior maximum-capacity component proofs remain
|
|
185
|
+
separate from this actual48-kHz browser functional boundary.
|
|
186
|
+
|
|
187
|
+
Prepared convolution requires unchanged certified host packets and normalized
|
|
188
|
+
input; native header/number scans do not certify arbitrary supplied spectra.
|
|
189
|
+
Preload while audible playback is gated off. Its cold/warm deadline misses remain
|
|
190
|
+
recorded. A loop overlap changes the effective duration and can cancel or smear
|
|
191
|
+
material; no antialiasing, universal seam removal, recording or streaming follows.
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
## Native take and frozen-tail browser boundary
|
|
195
|
+
|
|
196
|
+
`tests/capture-freeze-browser.test.mjs` adds two small actual 48 kHz worklets.
|
|
197
|
+
The recorder receives a synthetic native signal, not a microphone. A graph-side
|
|
198
|
+
length limit makes 64/128-frame capture and pause deterministic; a limit above
|
|
199
|
+
capacity proves the recorder's own 256-frame hard stop. The test checks segment
|
|
200
|
+
boundaries, playback through the existing sample player, overwrite/reset, restored
|
|
201
|
+
PCM and functional player readback, and loaded-prefix/recorded-suffix interpolation. A browser
|
|
202
|
+
Analyser window covers complete 256-frame periods for the playback mean.
|
|
203
|
+
|
|
204
|
+
Two independently instantiated frozen-tail subgraphs receive identical signals
|
|
205
|
+
until only one receives a new disturbance. Their nonzero outputs remain exactly
|
|
206
|
+
paired while fully frozen, separate again after thaw/reset, and recover a saved
|
|
207
|
+
paired nonzero history through native in-place restoration after every saved
|
|
208
|
+
control has actually rendered. The pre-restore pair must still differ, proving
|
|
209
|
+
that control synchronization did not reset away the mutation. Freeze amount and
|
|
210
|
+
frozen flags, unforced thaw decay, held reset and empty-tail freezing are checked
|
|
211
|
+
separately. The browser windows do not claim indefinite energy conservation or
|
|
212
|
+
sample-aligned waveform continuation; independent offline energy/state oracles
|
|
213
|
+
remain the evidence for those narrower numerical properties.
|
|
214
|
+
|
|
215
|
+
The installed consumer also renders both compositions at 44.1/48/96 kHz before
|
|
216
|
+
bundling. Browser execution must pass on the exact final head in hosted CI. These
|
|
217
|
+
checks introduce no capture permission, device bridge, storage service or runtime
|
|
218
|
+
clearance. Logical clearing of either storage does not securely erase old bytes.
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
## Experimental resident stretching boundary
|
|
222
|
+
|
|
223
|
+
`/resident-time-stretch` is a deliberately limited experiment, not a recommended
|
|
224
|
+
realtime default or completion of the time-stretch category. Independent review
|
|
225
|
+
found and corrected the exact rational EOF calculation: a 147-frame/44.1 kHz
|
|
226
|
+
resident at 48 kHz now has exactly 80/160/320 active frames for scales .5/1/2.
|
|
227
|
+
Active duration is not guaranteed nonzero or audible duration. A measured padded
|
|
228
|
+
edge lost most of the intended carrier (about .00145 versus .5 in its supported
|
|
229
|
+
interior), and a separate dominant-frequency example deviated by +3 Hz.
|
|
230
|
+
|
|
231
|
+
The final maximum graph is approximately 315 KB / 52,040-byte WASM with fixed
|
|
232
|
+
4,521,984-byte native memory. Independent packed timing observed 49.90 ms cold
|
|
233
|
+
and 21.84 ms warm maximum. An actually loaded maximum graph observed 2.385 ms
|
|
234
|
+
median and 7.927 ms maximum; all 256 measured quanta exceeded the 0.667 ms
|
|
235
|
+
budget at 192 kHz. These supplement earlier lower measurements. **NOT_REALTIME**
|
|
236
|
+
and **CANDIDATE** remain mandatory; mathematical correctness is not musical
|
|
237
|
+
quality, listening approval or hardware capacity clearance.
|
|
238
|
+
|
|
239
|
+
`tests/stretch-browser.test.mjs` requires actual 48 kHz native resident ingress,
|
|
240
|
+
exact active counts and first-EOF timing at both pitch settings, and an independent
|
|
241
|
+
scalar accumulation of rendered audio. A separate coherent, source-supported
|
|
242
|
+
interior checks latched parameter edits, retriggered frequency, exact EOF, held-
|
|
243
|
+
gate replacement cancellation, and in-place restoration of noninitial source
|
|
244
|
+
time plus PCM. Those selected interiors do not hide or supersede the retained
|
|
245
|
+
edge, arbitrary-tone, alias and cost counterexamples. Native three-rate exact
|
|
246
|
+
rational composition and public type/build checks precede the hosted browser
|
|
247
|
+
gate. Bit-exact quantum continuation remains separately verified offline.
|
|
248
|
+
|
|
249
|
+
The initial hosted PR38 and stacked PR39 gates exposed a real live-restore
|
|
250
|
+
ordering limitation: restored state can process under old AudioParams before
|
|
251
|
+
the host restores those values. Both measured paired-left residual
|
|
252
|
+
0.2498931884765625. An independent native one-quantum stale-control reproduction
|
|
253
|
+
matched that exact value; rendering saved controls before restoration recovers
|
|
254
|
+
bit-identical histories at all three rates, including poisoned transient scratch.
|
|
255
|
+
The deterministic negative-gap regression remains in the packed gate. The raw
|
|
256
|
+
browser attempt is retained as an observation, not required to race on every
|
|
257
|
+
schedule. This is documented caller coordination, not atomic restore support.
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
The inherited transitions browser probe exposed the same non-atomic control
|
|
261
|
+
boundary with a different lasting effect. At a 48 kHz / 375 Hz coherent input,
|
|
262
|
+
one stale ratio=.5 quantum advances the two-window pitch phase by 1/32, moving
|
|
263
|
+
read ages by 64 samples and permanently inverting the later unity-ratio output.
|
|
264
|
+
Independent native restoration with odd stale-quantum counts reproduces the
|
|
265
|
+
observed real-bin +0.006133459294852017 instead of -0.006133459294851527; even
|
|
266
|
+
gaps can appear correct. The negative-gap regression retains both cases.
|
|
267
|
+
|
|
268
|
+
The transitions fixture now renders all five saved ratio/time/gain/mix/reset
|
|
269
|
+
controls before restore and verifies them exactly through native telemetry,
|
|
270
|
+
including the small f32 delay-seconds value. It does not reset or retrigger the
|
|
271
|
+
pitch effect to hide phase state; all original complex phase/gain assertions
|
|
272
|
+
remain. MPE transient-state and instrument observer-clock findings stay separate.
|
|
273
|
+
|
|
274
|
+
The sustained instrument observer also separates published clock metadata from
|
|
275
|
+
captured samples. A failing and passing hosted 12-second WAV were byte-identical
|
|
276
|
+
despite repeated/skipped `currentFrame` values. The revised observer captures a
|
|
277
|
+
separate native buffer-source ramp and requires exact per-sample progression,
|
|
278
|
+
128-sample block lengths and 576,000 total samples, including silence. Its audio
|
|
279
|
+
oracle now predicts the complete steady interval with the original amplitude,
|
|
280
|
+
continuity and tail tolerances. Negative duplicate/drop/reorder/zero/short-block
|
|
281
|
+
controls verify those assertions. Raw clock anomalies remain explicit
|
|
282
|
+
`CLOCK_METADATA_ANOMALY_REQUIRES_REVIEW` findings; neither this observation fix
|
|
283
|
+
nor a numerical pass clears hardware or real-time acceptance (`NOT_CLEARED`).
|
|
284
|
+
|
|
285
|
+
## Musical quantization and spectral capture browser boundary
|
|
286
|
+
|
|
287
|
+
`tests/quantized-freeze-browser.test.mjs` uses actual native 48 kHz control/audio
|
|
288
|
+
outputs. Two three-degree quantizers compare nearest selection with inclusive
|
|
289
|
+
hysteresis, adjacent f32 boundary values, negative octaves and held reset. A saved
|
|
290
|
+
upper degree at the exact midpoint is contrasted with a fresh lower-nearest
|
|
291
|
+
selection after mutation. Saved controls are rendered before restoration; the
|
|
292
|
+
selected degree must remain different until persistent state is restored.
|
|
293
|
+
|
|
294
|
+
The small N64/H16 spectral graph captures constant input. Positive bin rotations
|
|
295
|
+
circularly shift the captured analysis window. Its steady held waveform therefore
|
|
296
|
+
has an independent closed-form, nonconstant N-periodic envelope, checked sample
|
|
297
|
+
by sample up to an unknown integer cyclic phase. A constant output, fitted RMS or
|
|
298
|
+
changed amplitude cannot substitute for this waveform. Live identity, held input
|
|
299
|
+
changes, latest-input release, a negative recapture and guarded recovery of the
|
|
300
|
+
original positive capture are checked separately. Native telemetry verifies the
|
|
301
|
+
saved controls while the negative capture is still present; reset and empty hold
|
|
302
|
+
are also required. Three-rate native composition/public type/build checks precede
|
|
303
|
+
actual browser execution. Exact full-state continuation stays independently
|
|
304
|
+
verified offline.
|
|
305
|
+
|
|
306
|
+
These are small functional graphs. Maximum 128-degree quantizer timing varied
|
|
307
|
+
from p50/p99/max 2.04/16.19/152.4 ms in one run to .60/4.91/10.31 ms in a later
|
|
308
|
+
run; both remain evidence, with no realtime clearance. Spectral freeze retains
|
|
309
|
+
strong captured-window modulation, colored off-bin textures, possible increased
|
|
310
|
+
peaks and no finite drain while held. Its ideal 2*sqrt(N) bound is not a limiter
|
|
311
|
+
or a finite-precision theorem. All audio remains CANDIDATE, with no new human
|
|
312
|
+
listening approval or completed general spectral/time-processing claim.
|
|
313
|
+
|
|
314
|
+
## Bounded spectral texture browser boundary
|
|
315
|
+
|
|
316
|
+
`tests/spectral-texture-browser.test.mjs` requires an actual muted 48 kHz N64/H32
|
|
317
|
+
composition. Two binary 17-sample native patterns and a persistent modulo-544
|
|
318
|
+
counter identify each observed sample's phase. The browser must match an
|
|
319
|
+
independent direct DFT/magnitude/IFFT/absolute-overlap waveform, without fitting
|
|
320
|
+
phase, amplitude or RMS. Amount-zero, full/intermediate blur, synchronized
|
|
321
|
+
same-input cross-synthesis, active gain cap, silent carrier/modulator and reset
|
|
322
|
+
are separate checks. Both inputs stay within the documented normalized range.
|
|
323
|
+
|
|
324
|
+
A native edge flips persistent source polarity before restoration. Every saved
|
|
325
|
+
control renders while that negative source and its nonzero output remain
|
|
326
|
+
observable. Native whole-graph restoration must recover the positive source and
|
|
327
|
+
its expected processed waveform. This verifies the browser's functional state
|
|
328
|
+
path; the short internal overlaps are already settled by host observation time.
|
|
329
|
+
Exact internal history/phase continuation is therefore credited to the separate
|
|
330
|
+
three-rate offline and installed-package tests, not inferred from delayed browser
|
|
331
|
+
reads. Core 0.4.1 state/AudioParam restoration remains non-atomic.
|
|
332
|
+
|
|
333
|
+
The independent component review covered 42 native cases and 210 exact PCM/state
|
|
334
|
+
continuations over every supported hop class and three rates. A deliberately
|
|
335
|
+
lagged modulator oracle differed by 0.35060, while the correct independent
|
|
336
|
+
DFT/WOLA comparison stayed within 3.623e-8. The packed tail check was corrected
|
|
337
|
+
before execution: an empty slice had provided no drain evidence. The retained
|
|
338
|
+
corrected proof checks 255 actual zero samples after 2N drainage.
|
|
339
|
+
|
|
340
|
+
Blur retains current phase only at nonzero bins at least 2^-20 of the frame's
|
|
341
|
+
maximum magnitude. Weaker bins use zero phase, preventing roundoff-sized null
|
|
342
|
+
phase from directing redistributed energy. This deliberate texture rule can
|
|
343
|
+
jump by 2T*abs(sin(phi/2)), up to twice the target bin magnitude; it is not phase
|
|
344
|
+
smoothing. Exactly representable scaling preserves the rule, while subnormal
|
|
345
|
+
input quantization can change near-threshold ratios. Cross-synthesis keeps
|
|
346
|
+
carrier phase and caps per-bin gain at a construction-fixed 1..16. Silent carrier
|
|
347
|
+
stays silent, and the cap can prevent complete magnitude replacement.
|
|
348
|
+
|
|
349
|
+
Public size is limited to N256 with H=N/2 or N/4. The existing N1024 single-input
|
|
350
|
+
boundary is not inherited by this dual-input composition. The loaded component
|
|
351
|
+
proof retained 64 KiB native memory and a 7.07 ms cold cross-synthesis quantum,
|
|
352
|
+
which exceeds the 48 kHz deadline; the measured warm maximum of 1.45 ms is only a
|
|
353
|
+
local diagnostic. Shared framing and FFT source remain unchanged, including the
|
|
354
|
+
unused modulator inverse/output work. All audio is CANDIDATE and runtime remains
|
|
355
|
+
NOT_CLEARED; no transparent speech, phase-vocoder or hardware guarantee follows.
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
## Bounded spatial composition browser boundary
|
|
359
|
+
|
|
360
|
+
`tests/spatial-browser.test.mjs` exercises actual public hybrid and feedforward
|
|
361
|
+
pitched-tail entries in a muted 48 kHz browser graph. The plain hybrid and two
|
|
362
|
+
identical pitched instances share a coherent native source. Its persistent
|
|
363
|
+
modulo-256 phase telemetry fixes the complex transfer reference without fitted
|
|
364
|
+
phase or amplitude. Independent FIR, fractional reflection and 4-by-4 FDN
|
|
365
|
+
transfer calculations check both stereo channels, immediate dry, unpitched and
|
|
366
|
+
unity-ratio paths. Specifically coherent octave and half-speed cases also check
|
|
367
|
+
shifted magnitudes, including half-sample interpolation loss; these do not imply
|
|
368
|
+
transparent arbitrary pitch changes.
|
|
369
|
+
|
|
370
|
+
Before saving, input is muted while paired tails remain nonzero. An independent
|
|
371
|
+
excitation then makes the two histories different. All saved controls render
|
|
372
|
+
again with that difference still present, before native whole-graph restore must
|
|
373
|
+
recover exact paired equality and a nonzero tail. This caller coordination is
|
|
374
|
+
required by the pinned core's non-atomic state/AudioParam restoration. Browser
|
|
375
|
+
observations establish functional recovery; exact waveform/state continuation
|
|
376
|
+
is separately checked at six boundaries over all three offline rates. Reset
|
|
377
|
+
has priority over bypass. Immediate dry and bypass outputs are checked directly
|
|
378
|
+
against the native input.
|
|
379
|
+
|
|
380
|
+
The source is normalized, but the FDN has no unity output bound. Independent
|
|
381
|
+
square-input probes reached peaks 1.13108 and 1.08859 for the two entries. The
|
|
382
|
+
maximum reviewed configuration retained 458,752 bytes of native memory. All six
|
|
383
|
+
reported cold processing measurements, 3.20–5.53 ms, missed their respective
|
|
384
|
+
quantum budgets; warm misses remain in the artifacts too. These code-only
|
|
385
|
+
candidates have no new listening or realtime clearance, no feedback shimmer,
|
|
386
|
+
and no arbitrary long-room claim. The browser composition has its own required
|
|
387
|
+
actual hosted execution in addition to installed-package types/render/build.
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
## Curved envelope and musical LFO browser boundary
|
|
391
|
+
|
|
392
|
+
`/musical-controls` adds a segment-relative curved ADSR and fixed sine, triangle,
|
|
393
|
+
saw and square LFOs, with free Hz or tempo/division control. Segment settings
|
|
394
|
+
latch at their declared entry points; zero durations, retrigger origins and
|
|
395
|
+
reset-consuming-gate behavior are explicit. LFO waveform phase is canonical
|
|
396
|
+
f32, waveforms are non-bandlimited, and live offset/seek changes may jump.
|
|
397
|
+
|
|
398
|
+
A narrow shared musical-clock repair keeps negative tiny seek positions below
|
|
399
|
+
the upper cycle boundary. The pre-fix native counterexample is retained.
|
|
400
|
+
Independent review checked all 64 cycle lengths, 52,864 native seek cases,
|
|
401
|
+
persistent-position restoration and byte-identical ordinary pre/post-fix output
|
|
402
|
+
and state. The change does not quantize all seeks or alter the pinned runtime.
|
|
403
|
+
|
|
404
|
+
`tests/musical-browser.test.mjs` requires actual 48 kHz native processing. A
|
|
405
|
+
persistent frame counter identifies every sample in a repeating curved ADSR
|
|
406
|
+
schedule with a nonzero retrigger origin. Independent event-time references
|
|
407
|
+
check the whole observed attack, decay, sustain and release sequence at positive,
|
|
408
|
+
negative and zero bends, including exact done flags. Four free LFOs and a
|
|
409
|
+
half-beat tempo LFO are checked against their phase waveforms and per-sample
|
|
410
|
+
frequency increments before and after native parameter edits.
|
|
411
|
+
|
|
412
|
+
Held nonzero phase is saved, moved to another phase, and then all saved controls
|
|
413
|
+
render while the phase remains different. Native whole-graph restore must
|
|
414
|
+
recover the original held phase and waveform. Tiny negative seeks and a
|
|
415
|
+
three-step clock test canonical upper bounds through the actual browser node.
|
|
416
|
+
This is coordinated restoration under core 0.4.1, not atomic state/parameter
|
|
417
|
+
restoration. Exact ADSR history and six native-quantum-boundary continuations remain
|
|
418
|
+
separately verified at all three offline rates.
|
|
419
|
+
|
|
420
|
+
Component packed measurements retained cold processing up to 4.81 ms and a
|
|
421
|
+
4.56 ms warm maximum for the four-LFO graph; these are local diagnostic misses,
|
|
422
|
+
not deadline clearance. All outputs are CANDIDATE. No host transport, device
|
|
423
|
+
timing, new listening approval or general realtime claim follows.
|
|
424
|
+
|
|
425
|
+
The integration fixture originally requested snapshots after 300 and 12034
|
|
426
|
+
samples. Pinned `renderOffline` rounds duration up to a complete 128-sample
|
|
427
|
+
quantum, so those requested boundaries were invalid. A retained native probe
|
|
428
|
+
shows 300 requested frames return 384, with restored counter 384. The corrected
|
|
429
|
+
splits are 128, 384, 4096, 7296, 10240 and 12032; the last lies inside held reset.
|
|
430
|
+
Exact bitwise output/state equality remains required, with a bounded first-
|
|
431
|
+
mismatch diagnostic instead of formatting an entire unequal audio array.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Bounded nonlinear character low-pass
|
|
2
|
+
|
|
3
|
+
Status: CANDIDATE. This is the representative nonlinear filter in
|
|
4
|
+
[catalog group 6](https://app.notion.com/p/3ef449b4e81d817db1acf1fff48779b3).
|
|
5
|
+
It is a four-stage saturating feedback low-pass with a deliberately discrete
|
|
6
|
+
topology. It does not claim to reproduce a particular analog circuit.
|
|
7
|
+
The existing clean filter, SVF, EQ, instrument and sounds are unchanged.
|
|
8
|
+
|
|
9
|
+
## Entry and musical controls
|
|
10
|
+
|
|
11
|
+
`characterFilter({ sampleRate })` from `@denaudio/den/character-filter` is an
|
|
12
|
+
ordinary unworklet `defineSubgraph`. Its immutable rate is finite, 8000–192000 Hz.
|
|
13
|
+
Call `tick(input, poleHz, resonance, drive, reset)` exactly once per sample.
|
|
14
|
+
The input and three controls are `Node<f32>`; reset is `Node<bool>`; the result
|
|
15
|
+
is a mono `Node<f32>`. Instantiate separately per channel or voice.
|
|
16
|
+
|
|
17
|
+
- Input explicitly clamps to [-8, 8] before drive. NaN becomes zero; infinities
|
|
18
|
+
clamp to their signed endpoint. This is an exposed input bound, not an
|
|
19
|
+
undocumented output safety clipper.
|
|
20
|
+
- `poleHz` clamps to [20, min(20000, sampleRate/5)] Hz; NaN becomes 20 Hz.
|
|
21
|
+
It sets the matched-z individual-pole tuning. Four poles together have a
|
|
22
|
+
lower small-signal -3 dB corner, approximately 0.435 × poleHz when poleHz is
|
|
23
|
+
well below the sample rate and resonance is zero. It is not an overall
|
|
24
|
+
measured -3 dB cutoff. Large input and resonance further change the response.
|
|
25
|
+
- `resonance` clamps to [0, 1]; NaN becomes zero. It maps linearly to global
|
|
26
|
+
negative feedback k = 4 × resonance. It is not Q. Increased feedback lowers
|
|
27
|
+
low-frequency gain and changes ringing; there is no automatic bass or level
|
|
28
|
+
compensation and no promised self-oscillation mode.
|
|
29
|
+
- `drive` is a linear pre-feedback input gain [0, 16]; NaN becomes one.
|
|
30
|
+
Zero removes new excitation but does not immediately mute existing history.
|
|
31
|
+
Drive and resonance interact inside the loop.
|
|
32
|
+
- Reset clears all four histories before processing the current input. A held
|
|
33
|
+
reset processes each sample from zero history. Reset may click. No smoothing,
|
|
34
|
+
bypass, wet/dry path, output makeup gain, lookahead or sample buffer is hidden.
|
|
35
|
+
|
|
36
|
+
Infinities on controls clamp to the corresponding endpoint. All three controls
|
|
37
|
+
are consumed every sample, including abrupt changes. The bound below includes
|
|
38
|
+
such changes; it does not establish click-free or alias-free modulation.
|
|
39
|
+
|
|
40
|
+
## Exact topology and state bound
|
|
41
|
+
|
|
42
|
+
Let S(v) = v / sqrt(1 + v²), a = 1 - exp(-2π poleHz / sampleRate), b = 1-a.
|
|
43
|
+
The current sample proceeds in this order, with all old histories captured first:
|
|
44
|
+
|
|
45
|
+
1. u = boundedInput × drive - k × oldStage4
|
|
46
|
+
2. stage1 = b × oldStage1 + a × S(u)
|
|
47
|
+
3. stage2 = b × oldStage2 + a × S(stage1)
|
|
48
|
+
4. stage3 = b × oldStage3 + a × S(stage2)
|
|
49
|
+
5. stage4 = b × oldStage4 + a × S(stage3); output = stage4
|
|
50
|
+
|
|
51
|
+
There is one sample of global feedback delay. The feed-forward cascade uses
|
|
52
|
+
current-sample stage outputs. This is neither a zero-delay nonlinear solver nor
|
|
53
|
+
a clean linear filter followed by distortion. Every stage's nonlinear transfer
|
|
54
|
+
changes the future feedback and history. No iterative convergence is required.
|
|
55
|
+
|
|
56
|
+
For the supported control/rate bounds, 0 < a < 1. Each state update is a convex
|
|
57
|
+
combination. Starting from zero or a snapshot produced by this same processor,
|
|
58
|
+
|stage1| ≤ 1, |stage2| ≤ 1/sqrt(2), |stage3| ≤ 1/sqrt(3), |stage4| ≤ 1/2:
|
|
59
|
+
S maps each preceding bound into the next one. This argument does not depend
|
|
60
|
+
on feedback, drive or tuning remaining constant. First-stage input magnitude
|
|
61
|
+
is at most 8×16 + 4×1/2 = 130. All arithmetic stays finite, and every state
|
|
62
|
+
and the output remain bounded under arbitrary legal control trajectories.
|
|
63
|
+
The output headroom bound is therefore 0.5 (-6.0206 dBFS), apart from rounding.
|
|
64
|
+
This is intentional cascaded saturation, not a transparent limiter claim.
|
|
65
|
+
It does not bound clicks, distortion, modulation spectra or perceptual loudness.
|
|
66
|
+
|
|
67
|
+
The small-signal, fixed-control transfer is
|
|
68
|
+
H(z) = drive × P(z)^4 / (1 + k z^-1 P(z)^4), P(z) = a/(1 - b z^-1).
|
|
69
|
+
At DC it approaches drive/(1+k). At Nyquist, P(-1) = a/(2-a), so
|
|
70
|
+
H(-1) = drive × P(-1)^4/(1 - k P(-1)^4). The delay's sign matters.
|
|
71
|
+
Nonlinear steady DC is separately determined by y = S(S(S(S(input×drive-k×y)))).
|
|
72
|
+
|
|
73
|
+
## Numeric choices and cost
|
|
74
|
+
|
|
75
|
+
All internal arithmetic is f64. The coefficient uses the degree-18 Taylor
|
|
76
|
+
polynomial for 1-exp(-x), x in [2π20/192000, 2π/5]. Its alternating-series
|
|
77
|
+
remainder is bounded by (2π/5)^19/19! < 6.4e-16. It does not call the runtime's
|
|
78
|
+
lower-precision exponential, and has no unrestricted-domain approximation.
|
|
79
|
+
The four audio histories use exact binary scaling 2^128 when stored. This keeps
|
|
80
|
+
tiny f32 histories above unworklet 0.4.1's scalar-state flush at
|
|
81
|
+
|stored value| < 1e-30. The corresponding unscaled history threshold is about
|
|
82
|
+
2.94e-69, far below the smallest f32 sample. Still smaller histories may flush;
|
|
83
|
+
there is no promise to preserve infinite mathematical tails. Arbitrary
|
|
84
|
+
hand-edited snapshots are not supported.
|
|
85
|
+
|
|
86
|
+
The graph has exactly four f64 state slots, four square roots and a fixed
|
|
87
|
+
coefficient polynomial per sample. Stage writes/readbacks materialize the
|
|
88
|
+
cascade; there is no runtime allocation, variable loop, parallel runtime,
|
|
89
|
+
oversampling, ADAA wrapper or additional framework. The first slot temporarily
|
|
90
|
+
holds the bounded coefficient inside tick and is overwritten with its normal
|
|
91
|
+
history before returning. A snapshot taken between blocks contains histories.
|
|
92
|
+
Same-processor/schema/rate native snapshots resume exactly.
|
|
93
|
+
|
|
94
|
+
## Evidence and limits
|
|
95
|
+
|
|
96
|
+
The focused tests and isolated installed-package consumer compare against a
|
|
97
|
+
scalar reference using Math.exp and Math.hypot, an independently derived
|
|
98
|
+
small-signal direct-form recurrence, and a bisection solution of the static DC
|
|
99
|
+
equation. They check 44.1/48/96 kHz, rate construction endpoints, signed input
|
|
100
|
+
and control bounds, nonfinite repair, high-drive headroom, control steps/sweeps,
|
|
101
|
+
DC and Nyquist, harmonics/folded residual, reset and held reset, distinct
|
|
102
|
+
instances, tiny/subnormal histories and noninitial snapshot continuation.
|
|
103
|
+
Negative controls reject bypass, omitted restore and a post-shaped linear
|
|
104
|
+
filter. Full evidence records include settings, source/input/output hashes,
|
|
105
|
+
raw unnormalized f32/WAV, fixed-scale waveforms and dependency/package identity.
|
|
106
|
+
|
|
107
|
+
The first local candidate passed all 20 focused tests plus the isolated
|
|
108
|
+
installed-package type, render, snapshot and actual worklet-build checks.
|
|
109
|
+
The three-rate recurrence maximum error was below 1.491e-8. The 16,384-frame
|
|
110
|
+
musical-control fixture peaked below 0.499602, with no scrubbed samples and exact
|
|
111
|
+
repeated PCM and noninitial snapshot continuation. A one-instance, five-input
|
|
112
|
+
offline graph compiled to 3,293 WASM bytes and a 226-byte snapshot containing
|
|
113
|
+
four scalar slots; the two-instance focused graph was 6,278 WASM bytes. These
|
|
114
|
+
are graph-specific artifact measurements, not callback timing guarantees.
|
|
115
|
+
|
|
116
|
+
The deliberately harsh 2-peak sine at normalized bin 997/4096, poleHz=fs/5,
|
|
117
|
+
resonance=0.7 and drive=16 measured folded residual 0.068893 RMS
|
|
118
|
+
(-23.24 dBFS). Frequency and pole tuning both scale with sample rate in this
|
|
119
|
+
case, so the 44.1/48/96 kHz result is the same normalized discrete system.
|
|
120
|
+
This audible-risk measurement is retained as a limitation; it is not suppressed
|
|
121
|
+
by normalizing the output or by calling the model antialiased.
|
|
122
|
+
|
|
123
|
+
The actual 48 kHz browser gate is implemented separately. It checks independent
|
|
124
|
+
steady-DC equations after drive/resonance changes, a pole-tuning change on a
|
|
125
|
+
997 Hz tone, and restoration of nonzero history after a verified reset to zero.
|
|
126
|
+
It has not been run locally. Hosted exact-head CI and independent review are
|
|
127
|
+
still required. A compiled worklet does not count as browser execution.
|
|
128
|
+
|
|
129
|
+
This is a base-rate nonlinear processor. Harmonics can alias. A downstream
|
|
130
|
+
low-pass cannot undo already folded energy; low output amplitude is not proof
|
|
131
|
+
of low aliasing. The coherent-tone residual measurement records this limitation
|
|
132
|
+
without claiming an anti-alias improvement or analog authenticity. No human
|
|
133
|
+
listening approval, approved golden, all-device real-time clearance, maximum
|
|
134
|
+
voice count or universal perceptual quality is established by these tests.
|
|
135
|
+
|
|
136
|
+
The formulas above define an original discrete model and independent oracle;
|
|
137
|
+
no third-party circuit source or preset is bundled. The catalog's
|
|
138
|
+
[Cytomic paper collection](https://cytomic.com/technical-papers/) is background
|
|
139
|
+
for distinguishing topology and response, not evidence of sonic equivalence.
|