@denaudio/den 0.0.0-stage → 0.2.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.
Files changed (191) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/LICENSE-APACHE +202 -0
  3. package/LICENSE-MIT +21 -0
  4. package/README.md +107 -2
  5. package/dist/biquad-eq.d.ts +11 -0
  6. package/dist/biquad-eq.js +35 -0
  7. package/dist/catalog-filter-math.d.ts +4 -0
  8. package/dist/catalog-filter-math.js +30 -0
  9. package/dist/character-filter.d.ts +13 -0
  10. package/dist/character-filter.js +53 -0
  11. package/dist/convolution-spectrum.d.ts +25 -0
  12. package/dist/convolution-spectrum.js +82 -0
  13. package/dist/convolution.d.ts +17 -0
  14. package/dist/convolution.js +87 -0
  15. package/dist/crossover.d.ts +11 -0
  16. package/dist/crossover.js +17 -0
  17. package/dist/curve-shaper.d.ts +26 -0
  18. package/dist/curve-shaper.js +73 -0
  19. package/dist/delay-fx.d.ts +37 -0
  20. package/dist/delay-fx.js +84 -0
  21. package/dist/delay-readhead.d.ts +19 -0
  22. package/dist/delay-readhead.js +54 -0
  23. package/dist/delay-settings.d.ts +55 -0
  24. package/dist/delay-settings.js +20 -0
  25. package/dist/drive.d.ts +24 -0
  26. package/dist/drive.js +116 -0
  27. package/dist/dual-head-delay.d.ts +28 -0
  28. package/dist/dual-head-delay.js +77 -0
  29. package/dist/dynamics.d.ts +61 -0
  30. package/dist/dynamics.js +130 -0
  31. package/dist/envelope.d.ts +34 -0
  32. package/dist/envelope.js +62 -0
  33. package/dist/filter.d.ts +9 -0
  34. package/dist/filter.js +34 -0
  35. package/dist/filterbank-vocoder.d.ts +35 -0
  36. package/dist/filterbank-vocoder.js +52 -0
  37. package/dist/formant-bank.d.ts +15 -0
  38. package/dist/formant-bank.js +28 -0
  39. package/dist/freeze-reverb.d.ts +35 -0
  40. package/dist/freeze-reverb.js +61 -0
  41. package/dist/frequency-shifter.d.ts +24 -0
  42. package/dist/frequency-shifter.js +57 -0
  43. package/dist/gate.d.ts +2 -0
  44. package/dist/gate.js +12 -0
  45. package/dist/index.d.ts +7 -0
  46. package/dist/index.js +12 -0
  47. package/dist/instrument-example.d.ts +12 -0
  48. package/dist/instrument-example.js +29 -0
  49. package/dist/instrument-settings.d.ts +95 -0
  50. package/dist/instrument-settings.js +36 -0
  51. package/dist/instrument.d.ts +42 -0
  52. package/dist/instrument.js +166 -0
  53. package/dist/lfo.d.ts +19 -0
  54. package/dist/lfo.js +55 -0
  55. package/dist/live-buffer.d.ts +39 -0
  56. package/dist/live-buffer.js +52 -0
  57. package/dist/live-granular.d.ts +41 -0
  58. package/dist/live-granular.js +64 -0
  59. package/dist/lookahead-limiter.d.ts +31 -0
  60. package/dist/lookahead-limiter.js +67 -0
  61. package/dist/loop-crossfade.d.ts +28 -0
  62. package/dist/loop-crossfade.js +72 -0
  63. package/dist/modulation-fx.d.ts +47 -0
  64. package/dist/modulation-fx.js +58 -0
  65. package/dist/modulation.d.ts +132 -0
  66. package/dist/modulation.js +228 -0
  67. package/dist/mpe-expression.d.ts +36 -0
  68. package/dist/mpe-expression.js +73 -0
  69. package/dist/multiband-dynamics.d.ts +50 -0
  70. package/dist/multiband-dynamics.js +60 -0
  71. package/dist/musical-controls.d.ts +76 -0
  72. package/dist/musical-controls.js +125 -0
  73. package/dist/musical-examples.d.ts +21 -0
  74. package/dist/musical-examples.js +142 -0
  75. package/dist/musical-materials.d.ts +110 -0
  76. package/dist/musical-materials.js +56 -0
  77. package/dist/oscillator.d.ts +10 -0
  78. package/dist/oscillator.js +35 -0
  79. package/dist/oversampled-drive.d.ts +19 -0
  80. package/dist/oversampled-drive.js +99 -0
  81. package/dist/performance.d.ts +61 -0
  82. package/dist/performance.js +241 -0
  83. package/dist/pitch-quantizer.d.ts +26 -0
  84. package/dist/pitch-quantizer.js +88 -0
  85. package/dist/prepared-convolution.d.ts +26 -0
  86. package/dist/prepared-convolution.js +104 -0
  87. package/dist/resident-recorder.d.ts +28 -0
  88. package/dist/resident-recorder.js +68 -0
  89. package/dist/resident-time-stretch.d.ts +46 -0
  90. package/dist/resident-time-stretch.js +136 -0
  91. package/dist/resonator.d.ts +32 -0
  92. package/dist/resonator.js +63 -0
  93. package/dist/reverb.d.ts +27 -0
  94. package/dist/reverb.js +52 -0
  95. package/dist/sample.d.ts +113 -0
  96. package/dist/sample.js +212 -0
  97. package/dist/source.d.ts +58 -0
  98. package/dist/source.js +113 -0
  99. package/dist/spatial-chains.d.ts +50 -0
  100. package/dist/spatial-chains.js +76 -0
  101. package/dist/spectral-fft.d.ts +27 -0
  102. package/dist/spectral-fft.js +84 -0
  103. package/dist/spectral-freeze.d.ts +24 -0
  104. package/dist/spectral-freeze.js +74 -0
  105. package/dist/spectral-gate.d.ts +23 -0
  106. package/dist/spectral-gate.js +58 -0
  107. package/dist/spectral-stft.d.ts +14 -0
  108. package/dist/spectral-stft.js +70 -0
  109. package/dist/spectral-texture.d.ts +46 -0
  110. package/dist/spectral-texture.js +141 -0
  111. package/dist/spectral.d.ts +18 -0
  112. package/dist/spectral.js +10 -0
  113. package/dist/state-variable-filter.d.ts +17 -0
  114. package/dist/state-variable-filter.js +25 -0
  115. package/dist/stereo-delay.d.ts +45 -0
  116. package/dist/stereo-delay.js +70 -0
  117. package/dist/virtual-analog.d.ts +26 -0
  118. package/dist/virtual-analog.js +66 -0
  119. package/dist/voice-policy.d.ts +37 -0
  120. package/dist/voice-policy.js +245 -0
  121. package/dist/wavetable-bands.d.ts +37 -0
  122. package/dist/wavetable-bands.js +145 -0
  123. package/dist/wavetable-read.d.ts +6 -0
  124. package/dist/wavetable-read.js +11 -0
  125. package/dist/wavetable.d.ts +29 -0
  126. package/dist/wavetable.js +49 -0
  127. package/dist/windowed-pitch-shift.d.ts +34 -0
  128. package/dist/windowed-pitch-shift.js +51 -0
  129. package/docs/catalog-audition.md +76 -0
  130. package/docs/catalog-filters.md +125 -0
  131. package/docs/catalog-modulation-fx.md +220 -0
  132. package/docs/catalog-status.md +433 -0
  133. package/docs/character-filter.md +139 -0
  134. package/docs/contracts.md +141 -0
  135. package/docs/control-modulation.md +194 -0
  136. package/docs/convolution.md +50 -0
  137. package/docs/curve-shaper.md +117 -0
  138. package/docs/delay-fx-capture-findings.json +134 -0
  139. package/docs/delay-fx.md +202 -0
  140. package/docs/delay-readhead.md +121 -0
  141. package/docs/delay-settings-candidate.json +333 -0
  142. package/docs/delay-settings.md +111 -0
  143. package/docs/dependency-findings.md +58 -0
  144. package/docs/deployment-status.md +37 -0
  145. package/docs/drive.md +152 -0
  146. package/docs/dual-head-delay.md +131 -0
  147. package/docs/dynamics.md +180 -0
  148. package/docs/envelope-integer-staging.md +64 -0
  149. package/docs/filter-materialization-results.json +71 -0
  150. package/docs/filter-materialization.md +135 -0
  151. package/docs/filter-oscillator.md +126 -0
  152. package/docs/filterbank-vocoder-entry.md +58 -0
  153. package/docs/freeze-reverb.md +179 -0
  154. package/docs/frequency-shifter.md +133 -0
  155. package/docs/frontend-audition.md +22 -0
  156. package/docs/gain-schedule-verification.md +53 -0
  157. package/docs/initial-acceptance.md +79 -0
  158. package/docs/instrument-performance.md +191 -0
  159. package/docs/instrument-settings.md +130 -0
  160. package/docs/instrument.md +204 -0
  161. package/docs/integration-candidate.md +114 -0
  162. package/docs/live-buffer.md +163 -0
  163. package/docs/live-granular.md +179 -0
  164. package/docs/lookahead-multiband.md +183 -0
  165. package/docs/loop-crossfade.md +99 -0
  166. package/docs/mpe-expression.md +65 -0
  167. package/docs/musical-clock-seek-boundary.md +31 -0
  168. package/docs/musical-controls-contract.md +144 -0
  169. package/docs/musical-examples.md +255 -0
  170. package/docs/oversampled-drive.md +153 -0
  171. package/docs/performance.md +53 -0
  172. package/docs/pitch-quantizer.md +55 -0
  173. package/docs/prepared-convolution.md +197 -0
  174. package/docs/realtime-audition.md +63 -0
  175. package/docs/resident-recorder.md +151 -0
  176. package/docs/resident-time-stretch.md +196 -0
  177. package/docs/sample.md +191 -0
  178. package/docs/sound-audition-headroom.md +103 -0
  179. package/docs/sources.md +81 -0
  180. package/docs/spatial-chains-entry.md +251 -0
  181. package/docs/spectral-freeze-entry.md +132 -0
  182. package/docs/spectral-gate-entry.md +134 -0
  183. package/docs/spectral-large-candidate.md +81 -0
  184. package/docs/spectral-texture-entry.md +178 -0
  185. package/docs/spectral.md +127 -0
  186. package/docs/virtual-analog.md +77 -0
  187. package/docs/voice-policy.md +38 -0
  188. package/docs/wavetable-bands.md +138 -0
  189. package/docs/wavetable.md +101 -0
  190. package/docs/windowed-pitch-shift.md +112 -0
  191. package/package.json +269 -4
@@ -0,0 +1,433 @@
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. The current dependency is unworklet
63
+ 0.6.0; older measurements below retain their original version and scope. See the
64
+ [0.2.0 migration notes](../CHANGELOG.md#020--2026-11-12). The only initial-DSP source exception is
65
+ a narrowly tested one-sample read-head construction-boundary correction; existing
66
+ common-rate audio/state/WASM parity is required.
67
+
68
+ `tests/catalog-composition.test.mjs` is the additional deployment-side boundary:
69
+ it builds the actual packed drive/dynamics composition and the nine-output FX
70
+ fixture into browser worklets. Native 48 kHz render, parameter edits, snapshot
71
+ restoration, tail decay and cleanup must pass in exact-head CI. The offline
72
+ component uses an independent fixed-input algebraic gain oracle. Offline success
73
+ at 44.1/48/96 kHz is never described as browser multi-rate support.
74
+
75
+ `tests/source-control-browser.test.mjs` adds a small seven-output source graph
76
+ (PM/FM, two additive partials, one unison voice, two modal modes and a comb), plus
77
+ native clock/sequence/MSEG/sample-and-hold/random controls. Analytic RMS/DC and frequency-bin checks, noninitial seek/held/random state,
78
+ reset and same-schema restore are required at actual 48 kHz. The source history
79
+ probe freezes nonzero phases, resets to zero, then checks recovery after restore.
80
+ The maximum-capacity source graph stays a separate offline/cost fixture: its
81
+ 32 partials, eight unison voices and 16 modes have exceeded the local 128-frame
82
+ quantum budget. The small browser functional gate does not certify that graph's
83
+ real-time deadline. The fixed arpeggiator has native output-ring/timestamp evidence
84
+ at three offline rates; browser-to-host/device delivery is not claimed.
85
+
86
+ `tests/materials-browser.test.mjs` requires actual 48-kHz native PCM-message
87
+ load, short replacement, unload and persistent-asset restore. The small sample
88
+ fixture ties every PCM sample to its rendered position and checks bounded grains,
89
+ N8 STFT/short-convolution DC and held reset. Its spectral browser checks are
90
+ functional: exact latency and continuation remain independently proved offline.
91
+ A one-voice performance fixture checks native note/pressure/bend/CC input,
92
+ frequency-bin retuning, sustain release, transient-note snapshot behavior and
93
+ panic. A separate small wavetable/VA graph checks asset completeness, frequency
94
+ edits, discrete pulse/triangle Fourier amplitudes and seeded-noise reset.
95
+
96
+ `tests/advanced-browser.test.mjs` adds actual 48-kHz signed-shift frequency bins,
97
+ useful-band image rejection, linked sample-ceiling edits, and independent complex
98
+ APlo×APhi reconstruction. Wet compression is checked separately from the aligned
99
+ dry output. Editable-curve tests check the linear two-tap transfer and a changed
100
+ ordinate's analytical DC value. Browser reset and parameter restoration are
101
+ functional checks; exact timing/state continuity remain independently proved
102
+ offline. The character-filter packed gate separately exercises native drive,
103
+ resonance/pole edits and noninitial history recovery in an actual browser.
104
+
105
+ The resource limits remain explicit. Sample max32-grain and combined source
106
+ profiles have exceeded the quantum budget; the full multiband fixture also retains
107
+ measured deadline misses despite its graph-size reduction. Native-loop spectral optimization
108
+ reduces graph expansion, but historical cold-start and large-frame watchdog
109
+ failures are retained. No maximum-capacity, long-IR, larger-frame or hardware
110
+ real-time clearance follows from these small browser compositions.
111
+
112
+ Local socket restrictions or a missing browser binary are recorded as blocked
113
+ browser stages, not successful tests. The historical initial runtime remains
114
+ NOT_CLEARED. Full exact-head CI, independent review, completed post-Ready automated review
115
+ and issue resolution precede
116
+ merge; this document itself does not certify that a pending run has completed.
117
+
118
+ ## Original catalog coverage and next lanes
119
+
120
+ | Original group | Current boundary / remaining work |
121
+ | --- | --- |
122
+ | 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 |
123
+ | 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 |
124
+ | 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 |
125
+ | 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 |
126
+ | 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 |
127
+ | 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 |
128
+ | 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 |
129
+ | 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 |
130
+ | 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 |
131
+ | 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 |
132
+ | 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 |
133
+ | 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 |
134
+ | 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 |
135
+
136
+ A missing advanced technique does not stop independently implementable catalog
137
+ work. A module name does not count as completed capability without its stated
138
+ contract and numerical/package evidence. Broader research and runtime limits are
139
+ kept separate from the useful, verified candidate surface.
140
+
141
+ The grouped [catalog audition](catalog-audition.md) exposes the four A/B musical
142
+ examples separately from the initial sounds. Its functional browser checks and
143
+ visible unity-default gain do not promote runtime or human-listening acceptance.
144
+
145
+ ## Transition and expression browser boundary
146
+
147
+ `tests/transitions-browser.test.mjs` builds a small five-output public composition
148
+ (two-times drive, fixed-head delay, 2048-sample pitch windows and N256 STFT) plus
149
+ a separate one-voice/two-member MIDI composition. Native controls must produce
150
+ the independent FIR phase/gain, fixed-delay phase, coherent doubled/halved pitch,
151
+ STFT identity and member/master pitch/amplitude equations. Reset silences the
152
+ DSP graph; native snapshot restoration is checked as a parameter path, while
153
+ exact buffer/history/hop-phase continuation remains proved offline. Expression
154
+ checks distinguish current live transient state from fresh-instance defaults.
155
+ A cold live restore uses explicit native composition reset before the next fresh
156
+ note; unreset held notes/controllers deliberately remain current. This is 48-kHz functional evidence, not maximum-capacity,
157
+ all-device deadline, arbitrary-input pitch quality or full MPE acceptance.
158
+
159
+ The transition browser gate also loads a small two-frame prepared pitch-band
160
+ asset, checks independent low-harmonic interpolation gains and high-pitch folded
161
+ harmonic rejection, edits the native frame, rejects short asset playback, and
162
+ restores PCM/parameters before a held-reset phase check. The cycle-local reader
163
+ precision repair is shared by both wavetable readers; rejected prior readers and
164
+ actual tiny-phase/full-range counterexamples remain in nonshipping tests.
165
+
166
+ The framewise [spectral gate](spectral-gate-entry.md) adds one bounded spectral
167
+ operation without changing no-hook STFT output or schema. Its small browser
168
+ composition checks native threshold/floor edits, all-pass/fixed-floor/closed
169
+ limits, rendered-parameter restore and reset against exact delayed-source
170
+ phase/gain. These functional limits supplement, rather than replace, the
171
+ independent active-bin DFT/WOLA and arbitrary-phase continuation tests. The
172
+ corrected candidate drains2N zeros; the original N-drained artifact is retained
173
+ as superseded evidence, not presented as the completed effect tail.
174
+
175
+ ## Prepared tails and loop browser boundary
176
+
177
+ `tests/tail-assets-browser.test.mjs` sends a full host-prepared8192-tap packet
178
+ through the native message path, checks the independent delayed FIR complex
179
+ transfer, rejects malformed metadata, unloads, replaces with a shorter IR,
180
+ restores native coefficients/history, and resets/restarts. The small resident
181
+ loop fixture compares every observed output sample to an independent scalar
182
+ phase/overlap equation for forward, reverse and fractional playback, and checks
183
+ shorter/empty replacement, held-gate invalidation, native asset/state restore
184
+ and reset/release. AudioContexts are suspended for synchronous multichannel
185
+ observation, then resumed; no alternate renderer or snapshot wrapper is used.
186
+ The three-rate offline gate and prior maximum-capacity component proofs remain
187
+ separate from this actual48-kHz browser functional boundary.
188
+
189
+ Prepared convolution requires unchanged certified host packets and normalized
190
+ input; native header/number scans do not certify arbitrary supplied spectra.
191
+ Preload while audible playback is gated off. Its cold/warm deadline misses remain
192
+ recorded. A loop overlap changes the effective duration and can cancel or smear
193
+ material; no antialiasing, universal seam removal, recording or streaming follows.
194
+
195
+
196
+ ## Native take and frozen-tail browser boundary
197
+
198
+ `tests/capture-freeze-browser.test.mjs` adds two small actual 48 kHz worklets.
199
+ The recorder receives a synthetic native signal, not a microphone. A graph-side
200
+ length limit makes 64/128-frame capture and pause deterministic; a limit above
201
+ capacity proves the recorder's own 256-frame hard stop. The test checks segment
202
+ boundaries, playback through the existing sample player, overwrite/reset, restored
203
+ PCM and functional player readback, and loaded-prefix/recorded-suffix interpolation. A browser
204
+ Analyser window covers complete 256-frame periods for the playback mean.
205
+
206
+ Two independently instantiated frozen-tail subgraphs receive identical signals
207
+ until only one receives a new disturbance. Their nonzero outputs remain exactly
208
+ paired while fully frozen, separate again after thaw/reset, and recover a saved
209
+ paired nonzero history through native in-place restoration after every saved
210
+ control has actually rendered. The pre-restore pair must still differ, proving
211
+ that control synchronization did not reset away the mutation. Freeze amount and
212
+ frozen flags, unforced thaw decay, held reset and empty-tail freezing are checked
213
+ separately. The browser windows do not claim indefinite energy conservation or
214
+ sample-aligned waveform continuation; independent offline energy/state oracles
215
+ remain the evidence for those narrower numerical properties.
216
+
217
+ The installed consumer also renders both compositions at 44.1/48/96 kHz before
218
+ bundling. Browser execution must pass on the exact final head in hosted CI. These
219
+ checks introduce no capture permission, device bridge, storage service or runtime
220
+ clearance. Logical clearing of either storage does not securely erase old bytes.
221
+
222
+
223
+ ## Experimental resident stretching boundary
224
+
225
+ `/resident-time-stretch` is a deliberately limited experiment, not a recommended
226
+ realtime default or completion of the time-stretch category. Independent review
227
+ found and corrected the exact rational EOF calculation: a 147-frame/44.1 kHz
228
+ resident at 48 kHz now has exactly 80/160/320 active frames for scales .5/1/2.
229
+ Active duration is not guaranteed nonzero or audible duration. A measured padded
230
+ edge lost most of the intended carrier (about .00145 versus .5 in its supported
231
+ interior), and a separate dominant-frequency example deviated by +3 Hz.
232
+
233
+ The final maximum graph is approximately 315 KB / 52,040-byte WASM with fixed
234
+ 4,521,984-byte native memory. Independent packed timing observed 49.90 ms cold
235
+ and 21.84 ms warm maximum. An actually loaded maximum graph observed 2.385 ms
236
+ median and 7.927 ms maximum; all 256 measured quanta exceeded the 0.667 ms
237
+ budget at 192 kHz. These supplement earlier lower measurements. **NOT_REALTIME**
238
+ and **CANDIDATE** remain mandatory; mathematical correctness is not musical
239
+ quality, listening approval or hardware capacity clearance.
240
+
241
+ `tests/stretch-browser.test.mjs` requires actual 48 kHz native resident ingress,
242
+ exact active counts and first-EOF timing at both pitch settings, and an independent
243
+ scalar accumulation of rendered audio. A separate coherent, source-supported
244
+ interior checks latched parameter edits, retriggered frequency, exact EOF, held-
245
+ gate replacement cancellation, and in-place restoration of noninitial source
246
+ time plus PCM. Those selected interiors do not hide or supersede the retained
247
+ edge, arbitrary-tone, alias and cost counterexamples. Native three-rate exact
248
+ rational composition and public type/build checks precede the hosted browser
249
+ gate. Bit-exact quantum continuation remains separately verified offline.
250
+
251
+ The initial hosted PR38 and stacked PR39 gates exposed a real live-restore
252
+ ordering limitation: restored state can process under old AudioParams before
253
+ the host restores those values. Both measured paired-left residual
254
+ 0.2498931884765625. An independent native one-quantum stale-control reproduction
255
+ matched that exact value; rendering saved controls before restoration recovers
256
+ bit-identical histories at all three rates, including poisoned transient scratch.
257
+ The deterministic negative-gap regression remains in the packed gate. The raw
258
+ browser attempt is retained as an observation, not required to race on every
259
+ schedule. This is documented caller coordination, not atomic restore support.
260
+
261
+
262
+ The inherited transitions browser probe exposed the same non-atomic control
263
+ boundary with a different lasting effect. At a 48 kHz / 375 Hz coherent input,
264
+ one stale ratio=.5 quantum advances the two-window pitch phase by 1/32, moving
265
+ read ages by 64 samples and permanently inverting the later unity-ratio output.
266
+ Independent native restoration with odd stale-quantum counts reproduces the
267
+ observed real-bin +0.006133459294852017 instead of -0.006133459294851527; even
268
+ gaps can appear correct. The negative-gap regression retains both cases.
269
+
270
+ The transitions fixture now renders all five saved ratio/time/gain/mix/reset
271
+ controls before restore and verifies them exactly through native telemetry,
272
+ including the small f32 delay-seconds value. It does not reset or retrigger the
273
+ pitch effect to hide phase state; all original complex phase/gain assertions
274
+ remain. MPE transient-state and instrument observer-clock findings stay separate.
275
+
276
+ The sustained instrument observer also separates published clock metadata from
277
+ captured samples. A failing and passing hosted 12-second WAV were byte-identical
278
+ despite repeated/skipped `currentFrame` values. The revised observer captures a
279
+ separate native buffer-source ramp and requires exact per-sample progression,
280
+ 128-sample block lengths and 576,000 total samples, including silence. Its audio
281
+ oracle now predicts the complete steady interval with the original amplitude,
282
+ continuity and tail tolerances. Negative duplicate/drop/reorder/zero/short-block
283
+ controls verify those assertions. Raw clock anomalies remain explicit
284
+ `CLOCK_METADATA_ANOMALY_REQUIRES_REVIEW` findings; neither this observation fix
285
+ nor a numerical pass clears hardware or real-time acceptance (`NOT_CLEARED`).
286
+
287
+ ## Musical quantization and spectral capture browser boundary
288
+
289
+ `tests/quantized-freeze-browser.test.mjs` uses actual native 48 kHz control/audio
290
+ outputs. Two three-degree quantizers compare nearest selection with inclusive
291
+ hysteresis, adjacent f32 boundary values, negative octaves and held reset. A saved
292
+ upper degree at the exact midpoint is contrasted with a fresh lower-nearest
293
+ selection after mutation. Saved controls are rendered before restoration; the
294
+ selected degree must remain different until persistent state is restored.
295
+
296
+ The small N64/H16 spectral graph captures constant input. Positive bin rotations
297
+ circularly shift the captured analysis window. Its steady held waveform therefore
298
+ has an independent closed-form, nonconstant N-periodic envelope, checked sample
299
+ by sample up to an unknown integer cyclic phase. A constant output, fitted RMS or
300
+ changed amplitude cannot substitute for this waveform. Live identity, held input
301
+ changes, latest-input release, a negative recapture and guarded recovery of the
302
+ original positive capture are checked separately. Native telemetry verifies the
303
+ saved controls while the negative capture is still present; reset and empty hold
304
+ are also required. Three-rate native composition/public type/build checks precede
305
+ actual browser execution. Exact full-state continuation stays independently
306
+ verified offline.
307
+
308
+ These are small functional graphs. Maximum 128-degree quantizer timing varied
309
+ from p50/p99/max 2.04/16.19/152.4 ms in one run to .60/4.91/10.31 ms in a later
310
+ run; both remain evidence, with no realtime clearance. Spectral freeze retains
311
+ strong captured-window modulation, colored off-bin textures, possible increased
312
+ peaks and no finite drain while held. Its ideal 2*sqrt(N) bound is not a limiter
313
+ or a finite-precision theorem. All audio remains CANDIDATE, with no new human
314
+ listening approval or completed general spectral/time-processing claim.
315
+
316
+ ## Bounded spectral texture browser boundary
317
+
318
+ `tests/spectral-texture-browser.test.mjs` requires an actual muted 48 kHz N64/H32
319
+ composition. Two binary 17-sample native patterns and a persistent modulo-544
320
+ counter identify each observed sample's phase. The browser must match an
321
+ independent direct DFT/magnitude/IFFT/absolute-overlap waveform, without fitting
322
+ phase, amplitude or RMS. Amount-zero, full/intermediate blur, synchronized
323
+ same-input cross-synthesis, active gain cap, silent carrier/modulator and reset
324
+ are separate checks. Both inputs stay within the documented normalized range.
325
+
326
+ A native edge flips persistent source polarity before restoration. Every saved
327
+ control renders while that negative source and its nonzero output remain
328
+ observable. Native whole-graph restoration must recover the positive source and
329
+ its expected processed waveform. This verifies the browser's functional state
330
+ path; the short internal overlaps are already settled by host observation time.
331
+ Exact internal history/phase continuation is therefore credited to the separate
332
+ three-rate offline and installed-package tests, not inferred from delayed browser
333
+ reads. Core 0.4.1 state/AudioParam restoration remains non-atomic.
334
+
335
+ The independent component review covered 42 native cases and 210 exact PCM/state
336
+ continuations over every supported hop class and three rates. A deliberately
337
+ lagged modulator oracle differed by 0.35060, while the correct independent
338
+ DFT/WOLA comparison stayed within 3.623e-8. The packed tail check was corrected
339
+ before execution: an empty slice had provided no drain evidence. The retained
340
+ corrected proof checks 255 actual zero samples after 2N drainage.
341
+
342
+ Blur retains current phase only at nonzero bins at least 2^-20 of the frame's
343
+ maximum magnitude. Weaker bins use zero phase, preventing roundoff-sized null
344
+ phase from directing redistributed energy. This deliberate texture rule can
345
+ jump by 2T*abs(sin(phi/2)), up to twice the target bin magnitude; it is not phase
346
+ smoothing. Exactly representable scaling preserves the rule, while subnormal
347
+ input quantization can change near-threshold ratios. Cross-synthesis keeps
348
+ carrier phase and caps per-bin gain at a construction-fixed 1..16. Silent carrier
349
+ stays silent, and the cap can prevent complete magnitude replacement.
350
+
351
+ Public size is limited to N256 with H=N/2 or N/4. The existing N1024 single-input
352
+ boundary is not inherited by this dual-input composition. The loaded component
353
+ proof retained 64 KiB native memory and a 7.07 ms cold cross-synthesis quantum,
354
+ which exceeds the 48 kHz deadline; the measured warm maximum of 1.45 ms is only a
355
+ local diagnostic. Shared framing and FFT source remain unchanged, including the
356
+ unused modulator inverse/output work. All audio is CANDIDATE and runtime remains
357
+ NOT_CLEARED; no transparent speech, phase-vocoder or hardware guarantee follows.
358
+
359
+
360
+ ## Bounded spatial composition browser boundary
361
+
362
+ `tests/spatial-browser.test.mjs` exercises actual public hybrid and feedforward
363
+ pitched-tail entries in a muted 48 kHz browser graph. The plain hybrid and two
364
+ identical pitched instances share a coherent native source. Its persistent
365
+ modulo-256 phase telemetry fixes the complex transfer reference without fitted
366
+ phase or amplitude. Independent FIR, fractional reflection and 4-by-4 FDN
367
+ transfer calculations check both stereo channels, immediate dry, unpitched and
368
+ unity-ratio paths. Specifically coherent octave and half-speed cases also check
369
+ shifted magnitudes, including half-sample interpolation loss; these do not imply
370
+ transparent arbitrary pitch changes.
371
+
372
+ Before saving, input is muted while paired tails remain nonzero. An independent
373
+ excitation then makes the two histories different. All saved controls render
374
+ again with that difference still present, before native whole-graph restore must
375
+ recover exact paired equality and a nonzero tail. This caller coordination is
376
+ required by the pinned core's non-atomic state/AudioParam restoration. Browser
377
+ observations establish functional recovery; exact waveform/state continuation
378
+ is separately checked at six boundaries over all three offline rates. Reset
379
+ has priority over bypass. Immediate dry and bypass outputs are checked directly
380
+ against the native input.
381
+
382
+ The source is normalized, but the FDN has no unity output bound. Independent
383
+ square-input probes reached peaks 1.13108 and 1.08859 for the two entries. The
384
+ maximum reviewed configuration retained 458,752 bytes of native memory. All six
385
+ reported cold processing measurements, 3.20–5.53 ms, missed their respective
386
+ quantum budgets; warm misses remain in the artifacts too. These code-only
387
+ candidates have no new listening or realtime clearance, no feedback shimmer,
388
+ and no arbitrary long-room claim. The browser composition has its own required
389
+ actual hosted execution in addition to installed-package types/render/build.
390
+
391
+
392
+ ## Curved envelope and musical LFO browser boundary
393
+
394
+ `/musical-controls` adds a segment-relative curved ADSR and fixed sine, triangle,
395
+ saw and square LFOs, with free Hz or tempo/division control. Segment settings
396
+ latch at their declared entry points; zero durations, retrigger origins and
397
+ reset-consuming-gate behavior are explicit. LFO waveform phase is canonical
398
+ f32, waveforms are non-bandlimited, and live offset/seek changes may jump.
399
+
400
+ A narrow shared musical-clock repair keeps negative tiny seek positions below
401
+ the upper cycle boundary. The pre-fix native counterexample is retained.
402
+ Independent review checked all 64 cycle lengths, 52,864 native seek cases,
403
+ persistent-position restoration and byte-identical ordinary pre/post-fix output
404
+ and state. The change does not quantize all seeks or alter the pinned runtime.
405
+
406
+ `tests/musical-browser.test.mjs` requires actual 48 kHz native processing. A
407
+ persistent frame counter identifies every sample in a repeating curved ADSR
408
+ schedule with a nonzero retrigger origin. Independent event-time references
409
+ check the whole observed attack, decay, sustain and release sequence at positive,
410
+ negative and zero bends, including exact done flags. Four free LFOs and a
411
+ half-beat tempo LFO are checked against their phase waveforms and per-sample
412
+ frequency increments before and after native parameter edits.
413
+
414
+ Held nonzero phase is saved, moved to another phase, and then all saved controls
415
+ render while the phase remains different. Native whole-graph restore must
416
+ recover the original held phase and waveform. Tiny negative seeks and a
417
+ three-step clock test canonical upper bounds through the actual browser node.
418
+ This is coordinated restoration under core 0.4.1, not atomic state/parameter
419
+ restoration. Exact ADSR history and six native-quantum-boundary continuations remain
420
+ separately verified at all three offline rates.
421
+
422
+ Component packed measurements retained cold processing up to 4.81 ms and a
423
+ 4.56 ms warm maximum for the four-LFO graph; these are local diagnostic misses,
424
+ not deadline clearance. All outputs are CANDIDATE. No host transport, device
425
+ timing, new listening approval or general realtime claim follows.
426
+
427
+ The integration fixture originally requested snapshots after 300 and 12034
428
+ samples. Pinned `renderOffline` rounds duration up to a complete 128-sample
429
+ quantum, so those requested boundaries were invalid. A retained native probe
430
+ shows 300 requested frames return 384, with restored counter 384. The corrected
431
+ splits are 128, 384, 4096, 7296, 10240 and 12032; the last lies inside held reset.
432
+ Exact bitwise output/state equality remains required, with a bounded first-
433
+ 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.