@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.
Files changed (191) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE-APACHE +202 -0
  3. package/LICENSE-MIT +21 -0
  4. package/README.md +102 -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 +15 -0
  14. package/dist/convolution.js +81 -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 +22 -0
  86. package/dist/prepared-convolution.js +99 -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 +44 -0
  90. package/dist/resident-time-stretch.js +135 -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 +48 -0
  100. package/dist/spatial-chains.js +76 -0
  101. package/dist/spectral-fft.d.ts +21 -0
  102. package/dist/spectral-fft.js +74 -0
  103. package/dist/spectral-freeze.d.ts +22 -0
  104. package/dist/spectral-freeze.js +74 -0
  105. package/dist/spectral-gate.d.ts +21 -0
  106. package/dist/spectral-gate.js +58 -0
  107. package/dist/spectral-stft.d.ts +13 -0
  108. package/dist/spectral-stft.js +69 -0
  109. package/dist/spectral-texture.d.ts +42 -0
  110. package/dist/spectral-texture.js +141 -0
  111. package/dist/spectral.d.ts +16 -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 +431 -0
  133. package/docs/character-filter.md +139 -0
  134. package/docs/contracts.md +131 -0
  135. package/docs/control-modulation.md +194 -0
  136. package/docs/convolution.md +45 -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 +61 -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 +188 -0
  174. package/docs/realtime-audition.md +63 -0
  175. package/docs/resident-recorder.md +151 -0
  176. package/docs/resident-time-stretch.md +190 -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 +250 -0
  181. package/docs/spectral-freeze-entry.md +130 -0
  182. package/docs/spectral-gate-entry.md +130 -0
  183. package/docs/spectral-large-candidate.md +74 -0
  184. package/docs/spectral-texture-entry.md +174 -0
  185. package/docs/spectral.md +118 -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,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.